Scala是多么纯粹和懒惰?
这只是其中一个“我在想…”的问题。
Scala具有不可变数据结构和(可选)惰性值等。 Scala程序对于完全纯粹(功能编程意义上)和完全懒惰(或Ingo指出,它可以是非常严格的)是多么接近?什么价值不可避免地是可变的,什么评估不可避免地贪婪? 解决方法
关于懒惰 – 目前,将参数传递给方法是默认的strict:
def square(a: Int) = a * a 但是您使用call-by-name参数: def square(a: =>Int) = a * a 但是这并不懒惰,只要它在需要时仅计算一次: scala> square({println("calculating");5}) calculating calculating res0: Int = 25 添加延迟方法参数有一些工作,但还没有被整合(下面的声明只能从上面打印出一次计算): def square(lazy a: Int) = a * a 这是一个缺失的部分,虽然你可以用本地的懒惰模拟它: def square(ap: =>Int) = { lazy val a = ap a * a } 关于可变性 – 没有任何东西阻止你写入不可变数据结构,并避免变异。您也可以在Java或C中执行此操作。事实上,some immutable data structures依靠懒惰的原语来实现更好的复杂性界限,但是懒惰的原语也可以在其他语言中被模拟 – 以额外的语法和样板为代价。 您可以随时在Scala中编写不可变数据结构,懒惰计算和完全纯粹的程序。问题是Scala编程模型允许编写非纯粹的程序,所以类型检查器不能总是推断程序的一些属性(如纯度),由于程序模型的限制性更强,因此可以推断出这一点。 例如,在具有纯表达式的语言中,上面的调用名称定义(a:=> Int)中的a * a可以进行优化,以仅评估一次,而不考虑通过名称的语义。如果语言允许副作用,那么这种优化并不总是适用的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |