2013-06-21 26 views
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

'(* 2)'是一个函数。 'x * 2'是一个数字。 –

回答

6

(*2)是函数。所以你试图添加1到一个不起作用的函数(禁止函数的Num实例)。

+0

值得指出的是,你要为函数定义一个num实例,它会做右薄 –

+0

@PhilipJF:即使有函数的Num实例,我认为它仍然是一个类型错误,因为“(+)'期望两个论点都是同一类型的。 – hugomg

+1

@missingo他们会虽然,对不对? '(* 2):: Num a => a - > a' while专业化后的'1 :: Num a => a - > a'('fromInteger',baby) –

8

(*2)定义Num a => a -> a类型的功能,一样

let multTwo x = x * 2 

所以您要加1的功能。

您可以使用组成,而不是:

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

其实''multTwo''是' (2 *)',而不是'(* 2)'。对于可交换的乘法,它当然没有太大区别。 – chirlu

+0

@chirlu - 感谢您的纠正。 – Lee

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 

这可能更符合你脑海中的想法。

相关问题