3

我现在正在学习 Haskell,并且正在尝试使用函数组合。

我写了两个函数。

let func1 x y = x + y

let func2 t = t*2

但是,当我尝试组合这两个函数时, func2 . func1 1 2我希望得到 6 个。

相反,我收到此错误:

   No instance for (Num (a -> b))
      arising from a use of `func1' at <interactive>:1:8-16
    Possible fix: add an instance declaration for (Num (a -> b))
    In the second argument of `(.)', namely `func1 1 2'
    In the expression: func2 . func1 1 2
    In the definition of `it': it = func2 . func1 1 2

有人可以解释为什么这不起作用吗?

4

3 回答 3

4

函数应用程序优先于任何运算符,因此您的组合被解析为func2 . (func1 1 2). 也就是说,您的代码尝试组合func1 1 2作为函数结果的数字。请注意,这(func2 . func1) 1 2也不起作用,因为(.)仅适用于一元函数。

可以使用(func2 . func1 1) 2,或者(.)以我个人不太习惯的方式多次使用,说实话。但在这种特定情况下,完全不使用组合可能会更好:func2 $ func1 1 2用更少的混乱做同样的事情。

于 2013-02-13T17:42:49.757 回答
3

由于一个幸运的错误(分配律),你可以这样做Data.Function.on

import Data.Function

func1 x y = x + y
func2 t = t*2

func3 = func1 `on` func2

-- or just func3 = (+) `on` (2*)

但总的来说,你应该只使用$这种东西,因为这就是你正在做的,功能应用程序。这不是真正的作曲工作,所以如果你使用作曲,你会试图将一个方形钉塞进一个圆孔。

于 2013-02-13T17:50:33.843 回答
1

您要做的不是功能组合:您正在尝试应用于func1 1 2func2这就是$运算符的用途。

func2 $ func1 1 2
于 2013-02-13T17:43:04.187 回答