功能组成错误

时间:2018-07-15 18:52:39

标签: f# functional-programming function-composition

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

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'
  1. 错误是什么意思
  2. 根据我的理解,函数组成要求第一个函数的返回类型必须与第二个函数的参数相同,在这里我认为这是正确的,因为prefixFun返回字符串,而exclaim期望使用string。

您能帮助我理解和解决问题吗?

谢谢。

1 个答案:

答案 0 :(得分:6)

在应用 one 参数后,

prefixFun不返回字符串。由于存在部分应用程序和函数,该函数返回类型为string -> string的函数。

这是>>的实现:

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

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

我觉得bigHello想要的功能是使用某人的名字并在其后添加感叹号的功能。这就是您可以用自己的东西做的事!

let bigHello = prefixFun "Hello " >> exclaim

请注意,prefixFun "Hello "的类型为string -> string, 因此要遵守功能组合的规则。