2010-09-02 95 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