使用 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 x
、Just _
、x@(y,z)
- Q 是一堆用逗号分隔的列表理解元素。 "list comprehension element" 我的意思是守卫(即
Bool
类型的表达式)或模式匹配,例如 x <- xs
、Right 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
.
如果您想知道这些术语的含义,报告中有更多详细信息。
来自 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 x
、Just _
、x@(y,z)
- Q 是一堆用逗号分隔的列表理解元素。 "list comprehension element" 我的意思是守卫(即
Bool
类型的表达式)或模式匹配,例如x <- xs
、Right 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, andQ
over sequences of qualifiers.ok
is a fresh variable. The functionconcatMap
, and boolean valueTrue
, are defined in thePrelude
.
如果您想知道这些术语的含义,报告中有更多详细信息。