ML 编程语言 - 咖喱函数

  • 本文关键字:函数 编程语言 ML sml ml
  • 更新时间 :
  • 英文 :


我需要找到一个签名为:

'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

谢谢。

问题是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

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

- fun f a b g = g(a, g(a,b));
val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> '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

关于函数的类型注释,另请参阅此问题。

最新更新