2015-04-01 101 views
0

我很努力去理解這一點。問題:SML類型 - >類型 - >類型

datatype 'a tree= Leaf of 'a | Node of 'a tree * 'a * 'a tree 

我必須找到使用二進制搜索它的價值。這是我的代碼。

fun binSearch ((Leaf n), x) = if n=x then true else false 
    | binSearch ((Node (left, n, right)), x) = 
     if n=x then true else 
     if n>x then binSearch (left, x) else 
     binSearch (right, x) 

但我應該寫函數與此簽名:

val binSearch : int tree -> int -> bool 

我得到的int tree * int -> bool一部分,但我該怎麼做'a -> 'b -> 'c

+0

駕車評論:「如果C然後真的別的假」是一種複雜的寫作'C'的方式。 ;)同樣,「如果C正確,否則E'只是'C orelse E'。 – 2015-04-02 07:32:01

+0

@AndreasRossberg所以如果我得到這個權利'1 = 1 orelse false'返回true,'1 = 2 orelse false'返回false。如果我寫代碼而不是'false'會怎麼樣? – Whazz 2015-04-02 19:57:51

+0

'C orelse false'與'C'返回一樣,所以你不會寫這個。 'C1 orelse C2'是'如果C1然後是真的別的C2'的簡稱。同樣,'C1和C2'也是'如果C1然後C2否則爲假'的簡稱。與C中的'||'和'&&'相同 – 2015-04-03 07:18:03

回答

1

要將a * b -> c類型的函數轉換爲a -> b -> c類型的函數,請將fun f (x, y) = ...替換爲fun f x y = ...

fun f (x, y) = ...定義了一個函數,它接收一個元組並自動將元組的值解包成變量xy。這是fun f tuple = case tuple of (x, y) => ...的語法快捷方式。它導致類型a * b -> c,因爲a * b表示「包含ab的元組」。該函數可以被稱爲f (x, y)f t,其中t是一個元組。

在另一方面fun f x y = ...限定了所謂的咖喱函數,這是一個函數,它的參數x然後返回另一個函數,該函數的參數y然後返回結果。它是fun f x = fn y => ...的語法快捷鍵。該函數可以稱爲f x yg y,其中g先前已被設置爲f x

0

簽名int tree * int -> bool意味着該函數取一對(int tree, int)作爲輸入並輸出bool

簽名int tree -> int -> bool相當於int tree -> (int -> bool),並且表示該函數採用int tree並輸出帶簽名int -> bool的函數。

簽名'a * 'b -> 'c得到這樣:

fun my_fun (a,b) = some_c 

而簽名'a -> 'b -> 'c得到這樣:

fun my_fun a = fn b => some_c 

也就是說,你必須創建並返回一個lambda表達式(一個匿名函數創建在飛行中)。

另外,請記住,第一種功能叫做這種方式:my_fun(my_tree,my_int),而第二種這種方式:my_fun my_tree my_int