-2

这段代码是在haskell中定义排他析取真值表

单击此处了解有关异或 代码的更多信息:

-- truth table concept of logical XOR
exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction = x y
    |True True <- False
    |True False <- True 
    |False True <- True 
    |False False <- False
    |otherwise = x y

结果:

 Ex6^.hs:31:5:
        parse error on input ‘|’
    Failed, modules loaded: none.

给定haskell语法中的异或真值表,如何使用两个布尔值设置警卫?

谢谢 请在不使用 haskell 内置运算符的情况下指定您的答案,这意味着不要使用 && ||。

为什么不能这样做?

exclusiveDisjunction2 :: Bool -> Bool -> Bool
exclusiveDisjunction2 x y
    |True True = False
    |True False = True 
    |False True = True 
    |False False = False

这是运行后的结果

   Couldn't match expected type ‘Bool -> Bool’ with actual type ‘Bool’
    The function ‘False’ is applied to one argument,
    but its type ‘Bool’ has none
    In the expression: False False
    In a stmt of a pattern guard for
                   an equation for ‘exclusiveDisjunction2’:
      False False
4

4 回答 4

6

已经有很好的答案,但从我的角度来看,我希望展示如何以更清晰的方式实现这一点。

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction True = not
exclusiveDisjunction False = id
于 2015-12-20T09:25:22.937 回答
6

正如@sibi 提到的,您正在犯语法错误。但是你正在做的是通过模式匹配来实现的。

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction True True = False
exclusiveDisjunction True False = True 
exclusiveDisjunction False True = True 
exclusiveDisjunction False False = False

这可以简化为

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction True True = False
exclusiveDisjunction True False = True 
exclusiveDisjunction _ a = a
于 2015-12-20T08:21:13.673 回答
5

最短的。

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction = (/=)
于 2015-12-20T10:37:17.710 回答
3

您正在犯语法错误。如果你真的想使用守卫,你可以这样做:

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction x y 
    | x == True && y == True = False
    | x == True && y == False = True 
    | x == False && y == True = True
    | x == False && y == False = False

但这可以通过case表达式更简单地实现:

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction x y = case (x,y) of
                             (True, True) -> False
                             (True, False) -> True
                             (False, True) -> True
                             (False, False) -> False

或者更简单地使用内置disjunction运算符:

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction x y = case (x,y) of
                             (True, True) -> False
                             otherwise -> x || y
于 2015-12-20T06:49:57.790 回答