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

对于Haskell中的列表理解,Scala中的等效项是什么?,scala,haskell,list-comprehension,Scala,Haskell,List Comprehension,我正在读哈斯凯尔的书“为你学习哈斯凯尔的伟大的好!”。第2章用这个小例子解释列表理解: boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x] 检查数字是否为奇数 提前感谢您提供的优雅解决方案 即使Scala的标准库中没有偶数或奇数函数(我不确定),实现这两个函数都很简单。假设是这样(为了使其与原始Haskell版本保持最接近),Scala代码可能如下所示 val boomBangs = f

我正在读哈斯凯尔的书“为你学习哈斯凯尔的伟大的好!”。第2章用这个小例子解释列表理解:

boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]   
检查数字是否为奇数


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

即使Scala的标准库中没有
偶数
奇数
函数(我不确定),实现这两个函数都很简单。假设是这样(为了使其与原始Haskell版本保持最接近),Scala代码可能如下所示

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

x作为理解的替代方案,这里有一个基于
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!)
def奇数(x:Int)=x%2==1
def动臂爆炸(xs:Seq[Int])=
xs过滤器奇数映射{i=>如果(i<10)“砰!”否则“砰!”)
爆炸(3::4::5::10::11::12::13::零)
//列表(砰!砰!砰!砰!)

对于理解,编译器实际上会将其翻译成带过滤器的
map
flatMap
表达式
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!)