繁体   English   中英

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

[英]For a list comprehension in Haskell the equivalent in Scala?

我正在阅读 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 在其标准库中没有evenodd函数(我不确定),实现它们也是微不足道的。 假设这样(为了使其与原始 Haskell 版本最接近),Scala 代码可能看起来像

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

免责声明:我暂时无法编译或测试它,所以不能保证它按原样工作。

作为 for-comprehensions 的替代方案,这里有一个基于filtermap的解决方案:

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 实际上被编译器翻译成withFiltermapflatMap表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM