在阅读有关函数组成的教程时,我尝试了以下操作:
let prefixFun a b = a + "" + b;;
let exclaim s = s + "!";;
let bigHello = prefixFun >> exclaim;;
但是bigHello
的定义返回以下类型不匹配错误
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'
prefixFun
返回字符串,而exclaim
期望使用string。 您能帮助我理解和解决问题吗?
谢谢。
答案 0 :(得分:6)
prefixFun
不返回字符串。由于存在部分应用程序和函数,该函数返回类型为string -> string
的函数。
这是>>
的实现:
let (>>) f g x = g ( f(x) )
请注意,f
仅应用于一个参数。
我觉得bigHello
想要的功能是使用某人的名字并在其后添加感叹号的功能。这就是您可以用自己的东西做的事!
let bigHello = prefixFun "Hello " >> exclaim
请注意,prefixFun "Hello "
的类型为string -> string
,
因此要遵守功能组合的规则。