我在Haskell中遇到的一个常见问题是要提取属于特定数据构造函数的列表中的所有术语,我想知道是否有比我现在做的方法更好的方法。
假设您有
data Foo = Bar | Goo
, 列表
foos = [Bar, Goo, Bar, Bar, Goo]
并希望从
Goo
中提取所有foos
。此刻我通常会做类似的事情goos = [Goo | Goo <- foos]
一切都很好。问题是当
Goo
有很多字段时,我被迫写了类似goos = [Goo a b c d e f | Goo a b c d e f <- foos]
这远非理想。您通常如何处理此问题?
最佳答案
似乎这个问题有两个部分:
首先,是一种更好的方式来匹配您不关心的字段:
goos = [ x | x@(Goo {}) <- foos]
其次,使用列表推导是编写此类过滤器的完美方法。例如,在基础库中,catMaybes定义为:
catMaybes :: [Maybe a] -> [a]
catMaybes ls = [x | Just x <- ls]
(来自基础库)。这样的习惯是好的。