也许可以避免贬值

时间:2017-06-05 10:08:51

标签: haskell

为什么计算以下表达式会终止?

scala> import org.apache.spark.ml.tuning.TrainValidationSplitModel

scala> val model2 = TrainValidationSplitModel.load("/home/waqas/models/lreg")
// model2: org.apache.spark.ml.tuning.TrainValidationSplitModel = tvs_99887a2f788d

scala> model2.transform(newData).show(3)
// +-----+--------------------+--------------------+
// |label|            features|          prediction|
// +-----+--------------------+--------------------+
// |  0.0|(692,[121,122,123...| 0.11220528529664375|
// |  0.0|(692,[122,123,148...|  0.1727599038728312|
// |  0.0|(692,[123,124,125...|-0.09619225628995537|
// +-----+--------------------+--------------------+
// only showing top 3 rows

foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..] (或其实现的类型类之一)是否有任何特殊之处导致评估在lambda返回Maybe后停止?

1 个答案:

答案 0 :(得分:4)

MaybeJustNothing在此处不起作用。我们所看到的只是工作中的懒惰。实际上,对于任何(总)函数f和值a,这也将终止:

foldr (\x t -> if x > 5 then f x else t) a $ [1..]

这完全等同于普通递归

foo [] = a
foo (x:xs) = if x > 5 then f x else foo xs

称为foo [1..]时。最终,x变为6,返回f 6,并且不再进行递归调用。