sml理解函数组合

sml理解函数组合,sml,ml,Sml,Ml,我试图理解这两者之间的区别 val my_fun = length o List.filter (fn (item) => item = #"a") o String.explode 可以调用此函数(my_fun“name”将返回1)并可以正常工作。我试图理解为什么下面的方法不起作用 length o (List.filter (fn (item) => item = #"a" ) (String.explode "name")) sml中函数组合的定义 f o g = f(g

我试图理解这两者之间的区别

val my_fun = length o List.filter (fn (item) => item = #"a") o String.explode 
可以调用此函数(my_fun“name”将返回1)并可以正常工作。我试图理解为什么下面的方法不起作用

length o (List.filter (fn (item) => item = #"a" ) (String.explode "name"))
sml中函数组合的定义

f o g = f(g(x))
在第二种形式中,我们所做的是(我认为)


您似乎混淆了函数组合和函数应用程序

合成是一个高阶函数,它包含两个兼容类型的函数,
f
g
,并返回另一个函数——首先将
g
应用于一个值,然后将
f
应用于结果来计算该函数
o
是一个内置操作符,但如果您想自己定义合成,它可能类似于

fun compose (f,g) x = f(g(x))
它有类型
fn:('a->'b)*('c->'a)->'c->'b
(这正是您在REPL中键入
(op o);
时得到的类型)。请注意,
compose
的返回值是
'c->'b
,这是一种函数类型

length o List.filter (fn (item) => item = #"a") o String.explode 
因为类型是兼容的,组合是正确的关联,所以非常有意义

另一方面,正如你已经注意到的

length o (List.filter (fn (item) => item = #"a" ) (String.explode "name"))
相当于

length o [#"a"]
那真的没有道理。用一个列表组成一个函数意味着什么。列表不是一个函数。将
length
应用于该列表是有意义的,这似乎是您所期望的

应用程序只是并置的,所以您所需要做的就是编写

长度(List.filter(fn(item)=>item=#“a”)(String.explode“name”))

这将减少到
长度[#“a”]
,然后从那里减少到1

如果您想编写自己的
apply
函数,您可以编写:

def apply f x = f x

这在表面上可能与
compose
相似,但其类型却截然不同:
fn:('a->'b)->'a->'b
。合成涉及应用程序,但它不是一回事。

合成定义中缺少参数<代码>(fog)x=f(gx),或
fog=fnx=>f(gx)
def apply f x = f x