斯卡拉:“从外面”,而不是“内而外”读(Scala: read “from outside in”

2019-10-20 07:48发布

我有一些看起来是这样的:

def a(b:String)(implicit c:String = "") = {println(b); b}

a("1")(a("2")(a("3")))

其打印

3

2

1

我怎样才能得到斯卡拉打印出这个呢?

1

2

3

Answer 1:

懒惰总是去使用之前不能调用代码的方式。 在你的榜样,但是,你没有使用c可言,这将意味着当它是懒惰其将绝不会在所有调用。

这种改变一点点会导致:

scala> def a(b: String)(c: => String = "") = {println(b); c; b}
a: (b: String)(c: => String)String

scala> a("1")(a("2")(a("3")()))
1
2
3
res15: String = 1

在这里, c被声明为调用式的名字,这会导致懒惰行为。 然而隐含参数不能调用按姓名,因此,我们必须使用一个更重量级的方法:

scala> import scala.language.implicitConversions
import scala.language.implicitConversions

scala> def a(b: String)(implicit c: () => String = () => "") = {println(b); c(); b}
a: (b: String)(implicit c: () => String)String

scala> implicit def conv(s: => String) = () => s
conv: (s: => String)() => String

scala> a("1")(a("2")(a("3")))
1
2
3
res0: String = 1

现在,懒惰是更明确的,但我们需要的隐式转换,让您的原始语法。

总之,你不能只是切换的你的函数参数的评估顺序,你要明白懒惰从中受益。 然而懒惰带有语法开销(至少在斯卡拉,哈斯克尔例如,将已经内置到语言),因此导致了不同的设计你的代码。



文章来源: Scala: read “from outside in” instead of “inside out”
标签: scala