身份函数在以下方法中的含义

时间:2014-12-20 15:39:09

标签: haskell boolean identity

如果列表中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)

1 个答案:

答案 0 :(得分:3)

函数filter (id)将从列表中过滤掉所有Falsefilter的类型为

filter :: (a -> Bool) -> [a] -> [a]

由于xor明确说明它需要[Bool]类型的参数,我们可以说a在这种情况下是Bool。替换回filter类型以使其不那么通用我们得到

filter :: (Bool -> Bool) -> [Bool] -> [Bool]

类似于id的类型:

id :: Bool -> Bool

因此,只要id返回Truefilter就会保留该元素,并且只要它返回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

但很容易看出isTrueid的{​​{1}}相同,因为只有2个案例要处理:

Bool