函数组合错误

Function Composition Error

在阅读有关函数组合的教程时,我尝试了以下操作:

let prefixFun a b = a + "" + b;;
let exclaim s = s + "!";;
let bigHello = prefixFun >> exclaim;;

但是bigHello的定义return出现了以下类型不匹配错误

let bigHello = prefixFun >> exclaim;;
----------------------------^^^^^^^

stdin(28,29): error FS0001: Type mismatch. Expecting a
'(string -> string) -> 'a'
but given a
    'string -> string'
The type 'string -> string' does not match the type 'string'
  1. 错误是什么意思
  2. 根据我的理解,函数组合要求第一个函数的 return 类型与第二个函数的参数相同,我认为这里是正确的,因为 prefixFun return s 字符串和 exclaim 需要字符串。

你能帮我理解并解决这个问题吗?

谢谢。

prefixFun,在应用 one 参数后,不是 return 字符串。由于部分应用和函数套用,它 return 是一个函数,类型为 string -> string

这是>>的实现:

let (>>) f g x = g ( f(x) )

请注意 f 仅应用于一个参数。

我感觉你想要的 bigHello 是一个函数,它接受某人的名字并在后面添加一个感叹号。这是您可以利用现有资源做的事情!

let bigHello = prefixFun "Hello " >> exclaim

请注意 prefixFun "Hello " 的类型为 string -> string, 所以函数组合的规则被遵守了。