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