Functional programming 咖喱函数
我有:Functional programming 咖喱函数,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我有: 我知道如何使用它,例如首先使用funsquarex=x*x,然后调用fsq3。但是,我不太理解第二行中的函数表达式。有人能帮我用英语解释一下,并指出哪个参数是'a,哪个参数是'b'F,这里有一个所谓的高阶函数,它有两个参数: p类型为'a->'b(所以它是一个函数!) q类型为'a F(如果先应用于'a->'b,然后应用于'a,则生成一个'b' 第二行正好告诉你这一点 此外,您知道is的功能:它将q插入p!(它将p应用于q) 你的例子当然是: square:int->int(因此这
我知道如何使用它,例如首先使用
funsquarex=x*x
,然后调用fsq3
。但是,我不太理解第二行中的函数表达式。有人能帮我用英语解释一下,并指出哪个参数是'a
,哪个参数是'b'
F
,这里有一个所谓的高阶函数,它有两个参数:
类型为p
(所以它是一个函数!)'a->'b
类型为q
'a
(如果先应用于F
,然后应用于'a->'b
,则生成一个'b''a
q
插入p
!(它将p
应用于q
)
你的例子当然是:
(因此这里的square:int->int
和'a
都必须是'b
,因为您使用int
代替square
)q
具有类型3
,因此表达式int
格式正确F square 3
- fun F p q = p q;
val F = fn : ('a -> 'b) -> 'a -> 'b
我还是有点困惑。它在哪里说('a->'b)->
'a
->'b?为什么不说('a->'b)->'c
->'b?也就是说,为什么fp
的输入类型与p
的输入类型相同?因为主体:pq
-当您将`p`应用于q
时,p
的域需要具有与q
相同的类型,否则这将不起作用-出于同样的原因,结果必须是p
(你为什么接受那里的'b
)既然->
是右关联的,那么类型('a->'b)->'a->'b
可以用一组额外的括号读取为('a->'b)->('a->'b)
。也就是说,F可以被视为一个接受函数并返回它的函数(F是一个参数函数的标识函数)。
F square 3
{ def F }
= square 3
{ def square }
= 3*3
{ arithmetic }
= 9