scala - 在 for 理解中绑定(bind)单个值

标签 scala haskell for-comprehension

Learn You a Haskell教程有一个示例 using a let binder in a list comprehension :

calcBmis xs = [bmi | (w, h) <- xs, let bmi = w / h ^ 2, bmi >= 25.0]

该函数接受一个高度/体重对的列表,并返回一个超出某个限制的相应体重指数的列表,例如:
ghci> calcBmis [(70, 1.85), (50, 2.00), (130, 1.62)]
[49.53513183965858]

这里让我感兴趣的是值 bmi绑定(bind)在推导式中的可以在守卫和结果表达式中使用。我知道如何在 Scala 中做类似事情的唯一方法是编写:
def calcBmis(xs : Seq[(Double,Double)]) =
  for((w,h) <- xs ; bmi <- Some(w / (h*h)) if bmi >= 25.0) yield bmi

必须将我的值(value)包装在 Some 中这里感觉不对。有人知道更好的方法吗?

最佳答案

是的,有这样的语法。

def calcBmis(xs : Seq[(Double,Double)]) =
  for((w,h) <- xs ; bmi = w / (h*h); if bmi >= 25.0) yield bmi

单线替代方案(但不是理解):
calcBmis.map(wh => wh._1/(wh._2*wh._2)).filter(_>=25.0)

关于scala - 在 for 理解中绑定(bind)单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609512/

相关文章:

scala - `trait ValueHolder { type ValueType }` 和 `trait ValueHolder[T] {}` 有什么区别

java - 如何将Scala语言与Spring Security集成

sorting - 在 Haskell 中将值插入到有序树中

java - 关于理解的奇怪问题

string - Scala中如何找到两个字符串的最长公共(public)前缀?

scala - 如何使 sbt 输出详细日志信息

haskell - 可扩展错误

Haskell:hackage Control.Applicative 文章中应用仿函数定律的描述中的缺陷?:它说 Applicative 决定 Functor

scala - 如何在Scala中使用自动增量索引进行理解

scala - 如何在Scala中将此map/flatMap转换为for comprehension?