这个问题来自Haskell新手。
我在下面编写代码来检查列表中有多少True
,如果它有even
个True
,则返回True
,否则返回`False&# 39;
xor =
foldr xor' False
where
xor' True True = False
xor' False False = False
xor' _ _ = True
但是,我在下面找到了一些代码片段,似乎它可以做同样的事情。 这是代码:
xor :: [Bool] -> Bool
xor = odd . length . filter id
但我不知道id
在上面的代码中是如何工作的,有人能给我一些帮助吗?
答案 0 :(得分:11)
id
的定义为id x = x
,因此filter id
与filter (\x -> x)
相同。也就是说,它需要列表的所有元素,其值为True
。
答案 1 :(得分:8)
id
函数是标识函数,定义非常简单
id :: a -> a
id x = x
函数filter
的类型为
filter :: (a -> Bool) -> [a] -> [a]
它接受一个返回布尔值的函数,将该函数应用于列表的每个元素,并保留函数返回True
的所有元素。因此,当您有filter id
时,它会过滤列表,返回所有等于True
的元素。