2013-05-05 59 views
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; 

回答

5

注意空格是無關緊要的,所以

filters not_zero nat_pairs() 

相同

filters not_zero nat_pairs() 

而且由於應用相關聯的左邊,這將括號爲

((filters not_zero) nat_pairs)() 

所以,()是第三個參數filters,不是一個nat_pairs

+0

好的,爲了完全理解,爲什麼我不能使用'filters(not_zero,nat_pairs())'?這也會清楚地表明not_zero和nat_pairs()都是參數。 – 2013-05-05 16:54:28

+0

你可以,如果你將它定義爲'fun filters(p,NIL)= ... |過濾器(p,CONS(x,r))= ...'然後'過濾器'具有不同的類型,即形狀'X * Y - > Z'而不是'X - > Y - > Z'。前者被稱爲tupled形式,後者是「curried」形式。無論使用什麼學習資料,都可能在某些時候討論這些表格。 – 2013-05-05 17:50:10