【问题标题】:A currying function柯里化函数
【发布时间】:2016-01-01 08:26:24
【问题描述】:

我有:

- fun F p q = p q;
val F = fn : ('a -> 'b) -> 'a -> 'b

我知道如何使用它,例如先使用fun square x = x*x,然后调用F Sq 3。但是,我不太了解第二行中的函数表达式。谁能帮忙用英文解释一下,并指出哪个参数是'a,哪个是'b'

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案1】:

    F 这是一个所谓的高阶函数,它有两个参数:

    • p 类型为 'a -> 'b(所以它是一个函数!)
    • q 类型为 'a
    • F(如果先应用到 'a -> 'b 然后再应用到 'a 会产生 `b

    第二行正好告诉你这一点。

    此外,您知道它的作用:它将q 插入p! (它适用于pq

    你的例子当然是:

    • square: int -> int(所以这里的'a'b 都需要int,因为您使用square 代替q
    • 3 具有 int 类型,因此表达式 F square 3 是格式正确的

    计算结果为:

    F square 3
    { def F }
    = square 3
    { def square }
    = 3*3
    { arithmetic }
    = 9
    

    【讨论】:

    • 我还是有点迷茫。它在哪里说('a->'b)->'a->'b?为什么不是 ('a->'b)->'c->'b?也就是为什么F p的结果和p的输入类型一样呢?
    • 由于正文:p q - 当您将“p”应用于q 时,p 的域需要与q 具有相同的类型,否则这将不起作用 - 到同样的原因结果必须是p的共同域(为什么你接受'b那里?)
    • 由于-> 是右结合的,('a -> 'b) -> 'a -> 'b 类型可以通过额外的括号集读取为('a -> 'b) -> ('a -> 'b)。也就是说,F 可以看作是一个接受一个函数并返回它的函数(F 是一个参数的函数的恒等函数)。
    猜你喜欢
    • 2021-02-07
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多