对于Haskell中的列表理解,Scala中的等价物是什么?

Twi*_*ton 5 haskell scala list-comprehension

我正在阅读Haskell的书"为了好大学而学习你的哈斯克尔!".第2章用这个小例子解释了列表理解:

boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]   
Run Code Online (Sandbox Code Playgroud)

有人可以在Scala中重写这个列表理解吗?Scala没有偶数或奇数函数?所以我必须使用

x%2!=0     
Run Code Online (Sandbox Code Playgroud)

检查数字是否奇数?

提前感谢您提供优雅的解决方案!

猩猩

Pét*_*rök 12

即使Scala 在其标准库(我不确定)中没有even或没有odd功能,实现它们也是微不足道的.假设这个(为了使它最接近原始的Haskell版本),Scala代码可能看起来像

val boomBangs = for {
  x <- xs
  if odd x
} yield if (x < 10) "BOOM!" else "BANG!"
Run Code Online (Sandbox Code Playgroud)

免责声明:我暂时无法编译或测试,因此无法保证其正常工作.

  • 它甚至可以按原样运行,除了几个括号:`odd(x)` (4认同)

Mal*_*off 6

作为理解的替代方案,这里有一个基于filter和的解决方案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!)
Run Code Online (Sandbox Code Playgroud)

对于-内涵实际上得到翻译成withFilter,mapflatMap表达由编译器.