我有一些代码在其中生成多个列表(通过理解),然后将它们连接起来。但是,有些单元素列表不起作用。在 Haskell 我会做类似的事情
[42 | i == j]
等效地是
(do guard (i == j)
return 42) :: [Int]
或者
(guard (i == j) >>= \_ -> return 1) :: [Int]
在斯卡拉我试过
for (if i == j) yield 42
但它说“简单模式的非法开始”。
在回答 Scala 的产量是什么时,作者说“Scala 的“for comprehensions”等同于 Haskell 的“do”notation”。
此外,在Scala 网站上,它说“理解具有(enums) yield e的形式,其中 enums 是指以分号分隔的枚举器列表。枚举器要么是引入新变量的生成器,要么是过滤器”。但显然,情况并非如此,因为过滤器似乎只允许在生成器之后使用。
目前我使用
if (i == j) List(42) else Nil
对于这种特殊情况,我可能不喜欢 for 理解语法,而只使用 if-then-else 代替。在 Haskell 中,由于与数学集合构建符号的相似性,它看起来相当不错。
我的问题不是关于风格,而是更多关于技术细节:为什么在 Haskell 和 Scala 之间的这个特定案例中存在差异?为什么不for (if i == j) yield 42
工作?