如何在不使用==或/=的情况下实现Haskell同或门(IFF)?
重写Haskell同或门(IFF)函数(禁用
==//=) 没问题!既然不能用==或/=运算符,我们可以利用Haskell布尔值的原生特性、逻辑运算或者模式匹配来实现同或逻辑——也就是当两个布尔值相同时返回True,不同时返回False。下面给你几种实用的实现方式:
1. 改造你原有的实现(最贴近你的写法)
你原来的代码里用了x == True和x == False,但在Haskell里,布尔值本身就可以直接作为判断条件:x == True等价于x,x == False等价于not x。直接替换后就能去掉所有==:
条件表达式版本
iffC x y = if x && y then True else if not x && not y then True else False
甚至可以更简洁(Haskell的if是表达式,else分支可以直接简化):
iffC x y = x && y || not x && not y
守卫版本
iffG x y | x && y = True | not x && not y = True | otherwise = False
2. 模式匹配实现(最直观的Haskell风格)
因为Bool类型只有True和False两个值,我们可以直接匹配所有可能的输入组合,逻辑一目了然:
iffPattern True True = True iffPattern False False = True iffPattern _ _ = False
这种写法直接列出所有返回True的情况,剩下的所有组合都返回False,可读性拉满。
3. 基于异或的反运算实现
同或逻辑其实是异或(XOR)的取反。我们可以手动实现异或逻辑(不用/=),再取反得到同或:
iffXor x y = not (x && not y || not x && y)
如果想让代码更清晰,还可以把异或逻辑抽出来作为辅助函数:
iffXor x y = not $ xor x y where xor a b = a && not b || not a && b
内容的提问来源于stack exchange,提问作者Daniel_H
相关产品推荐
相关产品推荐

