2015-05-17 38 views
0

簡單任務:我需要的是將參數列表應用於curried函數的函數。將參數列表應用於curried函數

比方說,我們的功能就是著名的add一個:

fun add a b = a + b; 

現在我想是應用列表(比如[1, 5])到add功能。這會看起來像:

apply add [1, 5]; 

這似乎比我想象的更難。我嘗試:

fun apply f ps = foldl (fn (p, f') => f' p) f ps; 

但這得到這個熱鬧可讀的錯誤信息:

Error: operator and operand don't agree [circularity] 
    operator domain: 'Z * ('Z -> 'Y) -> 'Z -> 'Y 
    operand:   'Z * ('Z -> 'Y) -> 'Y 
    in expression: 
    foldl (fn (p,f') => f' p) 

現在,什麼是錯我的執行? SML/NJ甚至可能嗎?

歡呼和感謝提示和答案。

回答

4

問題的根源在於,對於這個工作,摺疊函數的類型將不得不隨着摺疊列表而改變,並且這個(希望顯然)是不可能的。

(fn (p, f') => f' p)中的「圓形度」來自於f' p的類型必須與f'的類型相同的事實。

我個人的直覺是,你試圖做的事情是不可能的,因爲apply add [],apply add [1]apply add [1,2]必須有不同的類型。
apply add [1,2,3]根本沒有什麼意義。

一個有用的練習可能是試圖寫下apply的類型。

+0

是的,我以某種方式懷疑這一點。但是,我仍然認爲必須有一種方法來完成任務...... – scheffield

+1

@scheffield您的具體情況可以是硬編碼的,但這不是很有用。我相信你可以用像Idris這樣的類型系統來解決一般問題 - 你需要將函數的長度與列表的長度相匹配,我認爲*會或多或少地需要一個圖靈完整類型系統。當然,我也可能會說出自己的底線(雙關語意)。 – molbdnilo