为什么计算以下表达式会终止?
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
后停止?
答案 0 :(得分:4)
Maybe
,Just
和Nothing
在此处不起作用。我们所看到的只是工作中的懒惰。实际上,对于任何(总)函数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
,并且不再进行递归调用。