1

我需要在 ML 中编写一个多态函数,使其签名为:

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

我目前的版本是:

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 - >'一个

提前致谢。

4

1 回答 1

0

您不需要任何分支 ( if ... then ... else ...) 来实现这一点。基本上,给定

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

调用的结果sig4 (f, g) a c b必须是 type 'c -> 'a。如果你会使用

f a b

你得到了类型

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

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

f a (g a)

然后你得到

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

'c现在通过确保f需要 3 个参数来进行专业化

f a (g a) c

导致

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

怎么实现'd变成'a? 好吧,只需将 的结果f a (g a) c用作带有 a 的函数的参数'a(您有 2 个选择)。例如,

f (f a (g a) c)

带类型

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

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

于 2013-11-05T08:45:19.390 回答