2010-09-02 101 views
2

我需要根據傳遞給另一個函數的函數返回一個不同的值。標準ML:返回不同的類型

因此,考慮到:fun inc x = x + 1;

和:fun double [] = [] | double (h::t) = 2*h::double (t);

你應該能夠調用我的工作有任何的功能。

調用示例(我正在做的功能名爲test):

test (inc, 5); - 它會返回

- 或 -

test (double, [1,2,3,4]); - 它會返回[ 2,4,6,8]

我知道函數不能在面值上做到這一點,但這是可能的,通過層的抽象重刑?

+0

*即使有*一種方式 - 如果是答案,你可以提出錯誤的問題。爲什麼你認爲你需要它,爲什麼你不能使用'map'和singleton列表? – delnan 2010-09-02 19:04:00

+0

這就是我說「抽象」時的意思。使用'map'是我的第一個猜想,我只是無法弄清楚如何去做。 – Ryan 2010-09-02 20:36:53

回答

7

當然,這是可能的:

fun test (f, x) = f x 

test現在有型(('a -> 'b) * 'a) -> 'b,這意味着如果您在返回一個int的函數傳遞(如inc),其結果將是一個整數,如果你傳入返回一個列表的函數,結果將成爲一個列表。

作爲旁註:double可能更容易/慣用地定義爲fun double xs = map (fn x -> x*2) xsval double = map (fn x -> x*2)

+0

這正是我想要的。謝謝! – Ryan 2010-09-03 23:59:35