如果列表中True的计数是奇数,则函数返回True,否则返回False。
例如:
xor [False, True, False] == True
xor [False, True, False, False, True] == False
有人可以解释一下“过滤器(id)”在这里完成了什么:
xor :: [Bool] -> Bool
xor = foldr (\b a -> not b || not a) False . filter (id)
答案 0 :(得分:3)
函数filter (id)
将从列表中过滤掉所有False
。 filter
的类型为
filter :: (a -> Bool) -> [a] -> [a]
由于xor
明确说明它需要[Bool]
类型的参数,我们可以说a
在这种情况下是Bool
。替换回filter
类型以使其不那么通用我们得到
filter :: (Bool -> Bool) -> [Bool] -> [Bool]
类似于id
的类型:
id :: Bool -> Bool
因此,只要id
返回True
,filter
就会保留该元素,并且只要它返回False
,该元素就会被丢弃。所以
> filter id [True]
[True]
> filter id [False]
[]
> filter id [True, False, True]
[True, True]
> filter id [False, True, False]
[True]
输出只能是True
的列表。
另一种看待它的方法是创建自己的谓词函数,以便与filter
一起使用:
isTrue :: Bool -> Bool
isTrue True = True
isTrue False = False
然后你可以写
xor = foldr (\b a -> not b || not a) False . filter isTrue
但很容易看出isTrue
与id
的{{1}}相同,因为只有2个案例要处理:
Bool