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
    ,然后应用于
    'a
    ,则生成一个'b'
第二行正好告诉你这一点

此外,您知道is的功能:它将
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