1

为什么这个定义在 GHCi 中失败了?

let f = (*2)+1

No instance for (Num (a0 -> a0))
  arising from a use of `+'
Possible fix: add an instance declaration for (Num (a0 -> a0))
In the expression: (* 2) + 1
In an equation for `f': f = (* 2) + 1

它与以下有何不同?

let f x = x*2+1
4

3 回答 3

8

(*2)定义一个类型的函数Num a => a -> a,与

let multTwo x = x * 2

所以你试图将 1 添加到函数中。

您可以改用组合:

let f = (+1) . (*2)
于 2013-06-21T21:42:11.240 回答
6

(*2)是一个函数。因此,您正在尝试添加1一个不起作用的函数(禁止Num函数的实例)。

于 2013-06-21T21:41:47.677 回答
2

根据其他答案,您正在尝试将 1 添加到函数中。

不过,我可以看到您要做什么;类似于“前面”的咖喱:

let f = \x -> x * 2 + 1

这与

let f x = x * 2 + 1

根据李的回答,f = (+ 1) . (* 2)按照您的预期应用所有内容。您还可以执行以下操作以相反的方式应用所有内容:

import Control.Arrow

let f = (* 2) >>> (+ 1)           

-- Prelude Control.Arrow> f 5
-- 11

这可能更符合您的想法。

于 2013-06-21T23:56:31.360 回答