2
我是SML的初學者,只是寫了我的第一個函數。參數列表中的nat_pairs()和(nat_pairs())之間的區別
該函數應該生成一個自然數不包含零的數據流。
此功能使用過濾器謂詞與它的成員零之一刪除對創建一個語法錯誤:
fun nat_pairs_not_zero() = filters not_zero nat_pairs();
stdIn:56.20-59.1 Error: operator and operand don't agree [tycon mismatch]
operator domain: (int * int) sequ
operand: unit -> (int * int) sequ
in expression:
(filters nicht_null) nat_pairs
如果我先執行nat_pairs和存儲其結果和使用而造成的,它的工作原理。
fun nat_pairs_not_zero() = let
val lst = nat_pairs()
in
filters not_null lst
end;
如果我在nat_pairs
周圍添加更多大括號,它也可以。
fun nat_pairs_not_zero() = filters not_zero (nat_pairs());
如果我只執行(nat_pairs())
和nat_pairs()
,既給我相同的輸出:
val x = CONS ((0,0),fn) : (int * int) sequ
有人可以解釋我有和沒有括號的版本有什麼區別?
函數定義需要嘗試
type ’a lazy = unit -> ’a;
fun force (f:’a lazy) = f();
datatype ’a sequ = NIL
| CONS of ’a * ’a sequ lazy;
fun filters p NIL = NIL
| filters p (CONS (x,r)) =
if p x then CONS (x,fn()=>filters p (force r))
else filters p (force r);
fun next_pair (x,0) = CONS ((0,x+1), fn()=>next_pair((0,x+1)))
| next_pair (x, y) = CONS ((x+1,y-1), fn()=>next_pair(x+1,y-1));
fun nat_pairs() = CONS ((0,0), fn()=>next_pair((0,0)));
fun not_zero (0,b) = false
| not_zero (a,0) = false
| not_zero (a,b) = true;
好的,爲了完全理解,爲什麼我不能使用'filters(not_zero,nat_pairs())'?這也會清楚地表明not_zero和nat_pairs()都是參數。 – 2013-05-05 16:54:28
你可以,如果你將它定義爲'fun filters(p,NIL)= ... |過濾器(p,CONS(x,r))= ...'然後'過濾器'具有不同的類型,即形狀'X * Y - > Z'而不是'X - > Y - > Z'。前者被稱爲tupled形式,後者是「curried」形式。無論使用什麼學習資料,都可能在某些時候討論這些表格。 – 2013-05-05 17:50:10