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/