如何使用Haskell定义与Guards的独占析取

如何使用Haskell定义与Guards的独占析取,haskell,truthtable,Haskell,Truthtable,这段代码是为了在haskell中定义独占析取真值表 代码: 在haskell语法中,给定xor真值表,如何使用两个布尔值设置保护 多谢各位 请在不使用haskell内置运算符的情况下指定答案,这意味着不要使用&&| | 为什么不能这样做呢 exclusiveDisjunction2 :: Bool -> Bool -> Bool exclusiveDisjunction2 x y |True True = False |True False = True

这段代码是为了在haskell中定义独占析取真值表

代码:

在haskell语法中,给定xor真值表,如何使用两个布尔值设置保护

多谢各位 请在不使用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

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

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
或者更简单地使用内置的析取运算符:

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

正如@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

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

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction True = not
exclusiveDisjunction False = id
最短的

exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction = (/=)

x==True
相当于
x
x==False
相当于
而不是x
@gallais啊,是的,那会更好!您是否可以在没有Haskell内置运算符、没有&&| |的情况下指定此操作?please@abdulazizalmass:
&&
| |
(与Haskell中的所有中缀运算符一样)不是内置的,只是在标准库中定义的函数。实际上,它们似乎是GHC中内置的。但是它们也可以是库函数。@leftaroundabout我仍然不会说它们是内置的,因为它们是在GHC附带的名为
base
的库包中定义的。我非常喜欢答案的范围显示了同一段代码在Haskell中可以写得多么详细/简洁。您还可以看到从冗长到简洁的演变过程。更清楚吗?真正地那么,
exclusivedisjfunction=foldr1(.)呢。翻转下降[不,不]。fromEnum
?@user2407038这几乎是一个意见问题,这就是为什么我说“从我的角度”。你可以不同意。这不是一个逻辑运算符吗?@abdulazizalmass这是一个来自数据的函数。Bool感谢你的帮助和时间,但是/=是一个内置的haskell逻辑运算符。你正在回答它,但我需要警卫回答这个问题'ExclusiveDisjFunction 2::Bool->Bool->Bool ExclusiveDisjFunction 2 x y |真的=假|真假=真|假真=真|假假=假'
exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction True = not
exclusiveDisjunction False = id
exclusiveDisjunction :: Bool -> Bool -> Bool
exclusiveDisjunction = (/=)