我需要在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 - > “一
提前致谢。
答案 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
这几乎就是你想要的。我相信你会弄明白其余的。