2009-04-17 59 views
0

我得到什麼似乎是一個優先發布中調用一個函數SML,替補:SML函數調用不分析參數作爲參數

fun substitute v new (typevar q) = ... 

,我來自另一個函數調用這個:

fun new_type_vars (typevar v) non_gens = 
        substitute v new_var() (typevar v) 

但我得到一個錯誤:

 
    C:/sml/type_checker.sml:22.48-23.44 Error: operator and operand don't agree [tycon mismatch] 
     operator domain: type_exp 
     operand:   unit -> string 
     in expression: 
     (substitute v) new_var 

這似乎表明,它試圖調用(替代v),一然後用參數new_var調用該調用的結果。

我已經嘗試在整個事物中添加括號,但這沒有幫助,並且當我在(v new_var...)之類的參數周圍添加括號時,認爲v是new_var上的函數應用程序。這個函數調用發生了什麼?

回答

1

你可能想改變

substitute v new_var() (typevar v) 

substitute v (new_var()) (typevar v) 

(boutta的回答解釋了原因。)

1

我不明白一切,因爲你沒有給出所有類型的不同操作和變量。

但是,你得到的一般問題是你已經猜到了,SML從左側執行函數調用(並綁定變量)。這裏的一個示例:

fun f a:int b:int c:string = ... 

f是因此int類型的函數 - > INT - >串 - > ...和隱式地增加了括號的樂趣(((FA:INT)B:INT)C: INT)= ...

這意味着你可以使用它,例如像這樣:

var f2 = f 3; 

和F2現已int類型 - >字符串 - > ...