为什么这个简单的算术函数不进行类型检查?

时间:2013-06-21 21:38:14

标签: haskell

为什么这个定义在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

3 个答案:

答案 0 :(得分:8)

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

相同
let multTwo x = x * 2

因此您尝试将1添加到函数中。

您可以改为使用构图:

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

答案 1 :(得分:6)

(*2)是一个功能。所以你试图将1添加到一个不起作用的函数中(除了函数的Num实例)。

答案 2 :(得分:2)

根据其他答案,您尝试将1添加到某个功能中。

我可以看到你正在尝试做的事情;类似于前面的东西'钻营:

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

相同
let f x = x * 2 + 1

根据Lee的回答,f = (+ 1) . (* 2)适用于您所期望的一切。你也可以做这样的事情来反过来应用所有东西:

import Control.Arrow

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

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

这可能更符合你脑子里的想法。