【发布时间】:2013-05-06 05:36:25
【问题描述】:
我有一些代码在其中生成多个列表(通过理解),然后将它们连接起来。但是,有些单元素列表不起作用。在 Haskell 中,我会做类似的事情
[42 | i == j]
相当于
(do guard (i == j)
return 42) :: [Int]
或
(guard (i == j) >>= \_ -> return 1) :: [Int]
我在 Scala 中尝试过
for (if i == j) yield 42
但它说“简单模式的非法开始”。
In an answer to what Scala's yield is 作者说'Scala 的“for comprehensions”等同于 Haskell 的“do”notation'。
此外,在Scala website 上,它说“理解的形式为 for (enums) yield e,其中 enums 是指以分号分隔的枚举器列表。枚举器要么是生成器,要么引入了新变量,或者它是一个过滤器”。但显然,情况并非如此,因为过滤器似乎只允许在 生成器之后使用。
我现在使用
if (i == j) List(42) else Nil
对于这种特殊情况,我可能不喜欢 for 理解语法,而是使用 if-then-else。在 Haskell 中,由于与数学集合构建符号的相似性,它看起来相当不错。
我的问题不是关于风格,而是更多关于技术细节:为什么 Haskell 和 Scala 在这个特定案例中存在差异?为什么for (if i == j) yield 42 不起作用?
【问题讨论】:
-
我很惊讶 Haskell 中的列表理解确实有效。我本来希望在理解中也需要至少一个生成器。
标签: scala list-comprehension for-comprehension