我在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]
    

    (来自基础库)。这样的习惯是好的。

    10-08 06:57