ML中的Curried函数

时间:2013-11-05 08:14:27

标签: ml

我需要在ML中编写一个多态函数,这样它的签名就是:

sig4 = fn:('a - >'b - >'c - >'a)*('a - >'b) - > 'a - > 'c - > 'b - > 'c - > “一

我目前的版本是:

fun sig4 (f, g) a c b =
    if 1 > 2 then g(f(a) b c)
    else if 2 > 2 then f(a) b
    else g(a);

它产生:

sig4 = fn:('a - >'b - >'c - >'a)*('a - >'c - >'a) - > 'a - > 'c - > 'b - > 'c - > “一

提前致谢。

1 个答案:

答案 0 :(得分:0)

您无需任何分支(if ... then ... else ...)即可实现此目的。基本上,给定

fun sig4 (f, g) a c b = ...

来电sig4 (f, g) a c b的结果必须是'c -> 'a类型。如果你愿意的话

f a b

你有类型

('a -> 'b -> 'c) * 'd -> 'a -> 'b -> 'e -> 'c

要获得'a -> 'b而不是'd,只需将g应用于a作为f的第二个参数,即

f a (g a)

然后你得到

('a -> 'b -> 'c) * ('a -> 'b) -> 'a -> 'd -> 'e -> 'c

现在通过确保'c接受3个参数

来专门化f
f a (g a) c

导致

('a -> 'b -> 'c -> 'd) * ('a -> 'b) -> 'a -> 'c -> 'e -> 'd

如何将'd转变为'a?好吧,只需使用f a (g a) c的结果作为一个带'a的函数的参数(你有两个选择)。如,

f (f a (g a) c)

类型

('a -> 'b -> 'c -> 'a) * ('a -> 'b) -> 'a -> 'c -> 'd -> 'b -> 'c -> 'a

这几乎就是你想要的。我相信你会弄明白其余的。