我正在阅读 Haskell 书籍“Learn You a Haskell for Great Good!”。第 2 章用这个小例子解释了列表推导:
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
有人可以用 Scala 重写这个列表理解吗?Scala没有偶数或奇数函数?所以我必须使用
x%2!=0
检查数字是否奇数?
在此先感谢您提供优雅的解决方案!
我正在阅读 Haskell 书籍“Learn You a Haskell for Great Good!”。第 2 章用这个小例子解释了列表推导:
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
有人可以用 Scala 重写这个列表理解吗?Scala没有偶数或奇数函数?所以我必须使用
x%2!=0
检查数字是否奇数?
在此先感谢您提供优雅的解决方案!
即使 Scala 在其标准库中没有even
或没有odd
功能(我不确定),实现任何一个都是微不足道的。假设这一点(使其最接近原始 Haskell 版本),Scala 代码可能看起来像
val boomBangs = for {
x <- xs
if odd x
} yield if (x < 10) "BOOM!" else "BANG!"
免责声明:我暂时无法编译或测试它,所以不能保证它按原样工作。
作为理解的替代方案,这里有一个基于filter
and的解决方案map
:
def odd(x: Int) = x % 2 == 1
def boomBangs(xs: Seq[Int]) =
xs filter odd map {i => if (i < 10) "BOOM!" else "BANG!"}
boomBangs(3 :: 4 :: 5 :: 10 :: 11 :: 12 :: 13 :: Nil)
// List(BOOM!, BOOM!, BANG!, BANG!)
For-comprehensions 实际上被编译器翻译成withFilter
,map
和flatMap
表达式。