【问题标题】:Curried Functions in MLML 中的柯里化函数
【发布时间】:2013-11-16 01:19:06
【问题描述】:

我需要在 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 -> 'a

提前致谢。

【问题讨论】:

    标签: ml


    【解决方案1】:

    您不需要任何分支 (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
    

    现在通过确保 f 接受 3 个参数来专门化 'c

    f a (g a) c
    

    导致

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

    如何实现'd变成'a?好吧,只需使用 f a (g a) c 的结果作为接受 'a 的函数的参数(你有 2 个选择)。例如,

    f (f a (g a) c)
    

    有类型

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2015-10-28
      • 2015-08-25
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多