没有(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,你不能用(==)和一个数字执行BoolBool在Haskell中不是一个数字)。

为什么你用== 0写这个对我来说并不是很清楚,我们可以把它写成:

isEven :: Int -> Bool
isEven x
    | (divisibleBy x 2) = True
    | otherwise = False

但现在它仍然不优雅:我们不必检查条件是否适用于返回TrueFalse,我们可以简单地返回定义,所以:

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'的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript字面量

关于c语言判断电话号码合法问题

奏鸣曲碳库中的当年使用方法

c语言基础代码修改错误

2019年第十届蓝桥杯 - 省赛 - Java研究生组 - A. 立方和

boolfor循环.