使用 map 和 concat 将列表推导式转换为定义

translating list comprehensions to definitions using map and concat

来自 Haskell 的功能思考,第 67 页:

[...] list comprehensions are translated into equivalent definitions in
terms of map and concat. The translation rules are:

[e | True]       = [e] 
[e | q]          = [e | q, True] 
[e | b, Q]       = if b then [e | Q] else [] 
[e | p <- xs, Q] = let ok p = [e | Q]
                       ok _ = []
                   in concat (map ok xs)

作者没有定义e、q、Q或b。我认为第一个表示 "expression," 但我以前从未见过其他的。有没有人能赐教一下?

我猜:

  • e 是任何表达式,如你所说
  • q 是类型为 Bool
  • 的任何表达式
  • b 也是任何类型为 Bool 的表达式(这看起来有点奇怪,不过,也许我错了......)
  • p 是任何模式。例如,Right xJust _x@(y,z)
  • Q 是一堆用逗号分隔的列表理解元素。 "list comprehension element" 我的意思是守卫(即 Bool 类型的表达式)或模式匹配,例如 x <- xsRight x <- xs.

此翻译直接来自官方 Haskell Report,其中有以下附加句子:

where e ranges over expressions, p over patterns, l over list-valued expressions, b over boolean expressions, decls over declaration lists, q over qualifiers, and Q over sequences of qualifiers. ok is a fresh variable. The function concatMap, and boolean value True, are defined in the Prelude.

如果您想知道这些术语的含义,报告中有更多详细信息。