没有(Num Bool)的实例来自字面'0'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有(Num Bool)的实例来自字面'0'相关的知识,希望对你有一定的参考价值。
我的代码:
divisibleBy :: Int -> Int -> Bool
divisibleBy x y
| mod x y == 0 = True
| otherwise = False
isEven :: Int -> Bool
isEven x
| (divisibleBy x 2) == 0 = True
| otherwise = False
错误:
practical1.hs:30:28: error:
• No instance for (Num Bool) arising from the literal ‘0’
• In the second argument of ‘(==)’, namely ‘0’
In the expression: (divisibleBy x 2) == 0
In a stmt of a pattern guard for
an equation for ‘isEven’:
(divisibleBy x 2) == 0
|
30 | | (divisibleBy x 2) == 0 = True |
divisibleBy
功能起作用,但isEven
不起作用。我究竟做错了什么?
答案
好的错误信息已经说明了这一点。你写:
isEven :: Int -> Bool
isEven x
| (divisibleBy x 2) == 0 = True
| otherwise = False
现在,如果我们检查这个,我们看到(divisibleBy x 2)
将返回一个Bool
,你不能用(==)
和一个数字执行Bool
(Bool
在Haskell中不是一个数字)。
为什么你用== 0
写这个对我来说并不是很清楚,我们可以把它写成:
isEven :: Int -> Bool
isEven x
| (divisibleBy x 2) = True
| otherwise = False
但现在它仍然不优雅:我们不必检查条件是否适用于返回True
和False
,我们可以简单地返回定义,所以:
isEven :: Int -> Bool
isEven x = divisibleBy x 2
或者我们可以通过使用x
省略flip :: (a -> b -> c) -> b -> a -> c
参数:
isEven :: Int -> Bool
isEven = flip divisibleBy 2
同样适用于divisibleBy
函数,我们可以将其重写为:
divisibleBy :: Int -> Int -> Bool
divisibleBy x y = mod x y == 0
或者没有参数:
divisibleBy :: Int -> Int -> Bool
divisibleBy = ((0 ==) .) . mod
Swapping the parameters of divisableBy
看起来更多Haskell交换函数的参数,所以我们可以把它写成:
divisibleBy :: Int -> Int -> Bool
divisibleBy x y = mod y x == 0
从现在开始我们可以定义一个函数divisibleBy 2
,它将检查任何参数是否可以被2整除。
在这种情况下,isEven
函数,看起来像:
isEven :: Int -> Bool
isEven = divisibleBy 2
以上是关于没有(Num Bool)的实例来自字面'0'的主要内容,如果未能解决你的问题,请参考以下文章