我不允许使用==或/ =,但我不知道如何在没有它的情况下重写它。
iffC x y =
if x == True && y == True then True
else if x == False && y == False then True
else False
iffG x y
| y == True && x == True = True
| y == False && x == False = True
| otherwise = False
答案 0 :(得分:1)
可以使用模式
定义任何二进制布尔运算符op :: Bool -> Bool -> Bool
op x y =
if x
then if y then ... else ...
else if y then ... else ...
其中四个...
基本上是op
的真值表。
这通常导致反模式,如
if z then True else False
应该改写为
z
或
if z then False else True
应该改写为
not z
或
if z then True else True
应该改写为
True
或False
的类似案例。从本质上讲,这些if
总是可以重写为z, not z, True, False
之一。
答案 1 :(得分:0)
你可以重写这样的现有解决方案,我认为这是练习的目标。
iffC :: Bool -> Bool -> Bool
iffC x y = if x && y
then True
else False
iffG :: Bool -> Bool -> Bool
iffG x y | x && y = True
| otherwise = False
iffP :: Bool -> Bool -> Bool
iffP True True = True
iffP _ _ = False
我真的不明白这项练习是如何有益的,因为所有这些实现都是一种复杂的说法&&
。
答案 2 :(得分:0)
模式匹配似乎就像它的魅力一样。
iffC :: Bool -> Bool -> Bool
iffC True True = True
iffC False False = True
iffC _ _ = False
你可以获得让你的真相表可见的免费奖励。