加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala是多么纯粹和懒惰?

发布时间:2020-12-16 09:43:13 所属栏目:安全 来源:网络整理
导读:这只是其中一个“我在想…”的问题。 Scala具有不可变数据结构和(可选)惰性值等。 Scala程序对于完全纯粹(功能编程意义上)和完全懒惰(或Ingo指出,它可以是非常严格的)是多么接近?什么价值不可避免地是可变的,什么评估不可避免地贪婪? 解决方法 关于懒惰
这只是其中一个“我在想…”的问题。

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可以进行优化,以仅评估一次,而不考虑通过名称的语义。如果语言允许副作用,那么这种优化并不总是适用的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读