【发布时间】: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
我有:
- 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
F 这是一个所谓的高阶函数,它有两个参数:
p 类型为 'a -> 'b(所以它是一个函数!)q 类型为 'a
F(如果先应用到 'a -> 'b 然后再应用到 'a 会产生 `b第二行正好告诉你这一点。
此外,您知道它的作用:它将q 插入p! (它适用于p 到q)
你的例子当然是:
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)->'c->'b?也就是为什么F p的结果和p的输入类型一样呢?
p q - 当您将“p”应用于q 时,p 的域需要与q 具有相同的类型,否则这将不起作用 - 到同样的原因结果必须是p的共同域(为什么你接受'b那里?)
-> 是右结合的,('a -> 'b) -> 'a -> 'b 类型可以通过额外的括号集读取为('a -> 'b) -> ('a -> 'b)。也就是说,F 可以看作是一个接受一个函数并返回它的函数(F 是一个参数的函数的恒等函数)。