首页 > 解决方案 > Haskell中的函数snd如何在过滤器中工作

问题描述

我将此代码输入到 ghci

Prelude> filter snd [('a',True),('b',True),('c',False),('d',True)]

为什么它会返回

[('a',True),('b',True),('d',True)]

而不是

[('a',True),('c',False),('d',True)]

snd函数返回第二项,那么为什么不filter snd过滤第二项呢?

标签: listhaskellfilterfilteringpredicate

解决方案


您希望从该表达式的口语意义上filter的列表中“过滤掉”元素,从而 删除第二项。filter snd

这不是它的工作方式

如果你是对的,filter snd [1,2,3]将评估为[1,3]. 相反,它不进行类型检查,因为它snd适用于元组,而不是数字。

那么它是怎样工作的?

filter f [item1, item2, ...]返回所有items的f item列表True

例如,filter even [1,2,3,4]返回[2,4]

snd ('b', True)评估为,True在您的示例filter中将包含(b, True)在结果中。同理,(c, False)将省略


推荐阅读