什么是;id";在这个Haskell代码中是什么意思?
这个问题来自Haskell的一个新手 我在下面编写代码来检查列表中有多少个什么是;id";在这个Haskell代码中是什么意思?,haskell,Haskell,这个问题来自Haskell的一个新手 我在下面编写代码来检查列表中有多少个True,如果它有偶数个True,则返回True,否则返回'False' xor = foldr xor' False where xor' True True = False xor' False False = False xor' _ _ = True 但是,我在下面找到了一些代码片段,它似乎也可以做同样的事情。。 代码如下: xor :: [Bool] -> Bool xor = odd . length
True
,如果它有偶数个True
,则返回True
,否则返回'False'
xor =
foldr xor' False
where
xor' True True = False
xor' False False = False
xor' _ _ = True
但是,我在下面找到了一些代码片段,它似乎也可以做同样的事情。。
代码如下:
xor :: [Bool] -> Bool
xor = odd . length . filter id
但是我只是不知道id
在上面的代码中是如何工作的,有人能给我一些帮助吗?id
的定义是id x=x
,所以过滤器id
与过滤器(\x->x)
是一样的。也就是说,它接受列表中值为True
的所有元素,id
函数是identity函数,定义非常简单
id :: a -> a
id x = x
函数过滤器
具有以下类型
filter :: (a -> Bool) -> [a] -> [a]
它接受一个返回布尔值的函数,将该函数应用于列表中的每个元素,并保留该函数返回的所有元素True
。因此,当您拥有filter id
时,它会过滤返回所有元素的列表,这些元素等于True
这是标识函数:id
只是标识函数filter id
与filter(=True)
相同-它只是删除了False
元素。我想知道谁会否决这个非常好的问题(对于初学者)-伙计们,我们应该让非常积极的Haskell子组友好@卡斯滕:是的,哈斯凯尔社区有一个值得维护的声誉!在一个不相关的not上,您还可以更简洁地定义xor
,并以更少的内存消耗作为xor=foldr1(/=)
谢谢您,Bheklillr,您给了我正确的回答,但我只能选择一个作为“答案”。我不知怎的知道id
,它就像函数的[]
。然而,在这个特殊的问题上使用它确实让我大吃一惊:)