微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ML 编程语言 - Curry 函数

如何解决ML 编程语言 - Curry 函数

我需要找到一个具有以下签名的函数

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

所以我尝试这样做:

fun f a b g = g(a,b)

得到结果:

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

如何根据需要将此 c 设置为 b

非常感谢。

解决方法

你可以写一个显式的类型注解,例如:

fun f a b (g : _ * 'b -> 'b) = g(a,b)
(* val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> 'b *)

推断类型 'a -> 'b -> ('a * 'b -> 'c) -> 'c 比您强加的类型 'a -> 'b -> ('a * 'b -> 'b) -> 'b 严格得多。

关于函数的类型注释,另见this question

,

问题在于 g(a,b) 不限制结果类型。

您唯一可以访问的 'b 类型的值是第二个参数,因此您需要将其返回到某处,或者使用它以某种方式限制结果。

一个非常简单的解决方案是添加一个条件,

- fun f a b g = if false then b else g(a,b);
val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> 'b

几周后的附录,因为我突然想起了一个更优雅的解决方案,没有丑陋的条件。
由于 g 的结果应该与它的第二个参数具有相同的类型,因此您可以为其提供自己的结果。
这将强制 bg(a,b) 具有相同的类型:

- fun f a b g = g(a,g(a,b));
val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> 'b

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。