【问题标题】:Do the mutable Collection.empty methods violate Scala's zero-argument naming convention?可变的 Collection.empty 方法是否违反了 Scala 的零参数命名约定?
【发布时间】:2015-09-18 00:54:09
【问题描述】:

This 是在 Scala 11.5 的 scala.collection.mutable.Map 对象中声明 .empty 方法的方式:

def empty[A, B]: Map[A, B]

这个方法不应该有空括号,像这样吗?

def empty[A, B](): Map[A, B]

Scala 的naming conventions 上的页面暗示,没有明确说明,省略 0 元方法上的括号是纯函数代码的约定,包含空括号意味着该方法有副作用。 (我想我遇到了更明确的错误消息。)

可变的.empty 方法有一个副作用,因为您可以区分单独调用.empty 的结果。它不应该得到空括号,即使它在immutable.Map 中的伴侣没有?

关于我自己的代码,在从 0-arity 方法创建和返回可变对象时是否应该遵循特殊的命名约定?

【问题讨论】:

    标签: scala collections naming-conventions side-effects


    【解决方案1】:

    没有。 scala.collection.mutable.Map.empty[A, B] 没有任何副作用。这是一个每次调用都会返回一个新的mutable.Map[A, B]的方法。

    mutable.Map#empty(特征本身的方法)也返回一个新的空mutable.Map 相同类型。它不会清空集合(就像它看起来可能的那样),因此没有副作用。

    如果您不确定,请联系the source

    【讨论】:

    • 我的理解是,如果用保存第一次调用结果的变量替换对函数的第二次调用时,程序的结果发生了变化,那么函数就会产生副作用。每次调用.empty 时都必须有所不同,这是必要的,以便您以后可以修改一个空地图而不会影响另一个。或者我是否遵循“副作用”的非标准命名约定? :) 我基本上是从 Functional Programming in Scala, p. 10.
    • @benkovitz 我认为您将“无副作用”与“引用透明”混淆了?
    • @ChrisMartin 谢谢!事实上,我并没有区分它们。函数式编程倡导者反复责骂我创建相同但不是.equal 的对象是一种副作用,我看到了这个想法的优点。事实上,对象身份有时会破坏我的 Scala 程序中的确定性。是否有一些约定创建对象甚至不打算保留 .equal doesn't count 作为副作用?
    【解决方案2】:

    这在 JVM 上有点乱。

    在存在 eq/ne 和 System.identityHashCode 之类的操作时,即使创建一个新的 immutable 对象也会有明显的副作用(即在JVM 的内部,以便下一个对象将具有不同的引用 hashCode)。所以在 JVM 领域,除了返回一个新对象之外什么都不做的函数被认为是无副作用的。如果返回的对象是可变的,那么即使生成可变对象本身的函数被认为是无副作用的,引用透明度也会消失。

    如果您真的对此很迂腐,那么 JVM 上有 没有 无副作用的函数返回非原始函数。

    scala> import scala.collection.immutable._
    scala> SortedSet.empty[Int] eq SortedSet.empty[Int]
    res4: Boolean = false
    

    【讨论】:

    • 确实,我认为真正的计算机中的任何东西都不可能没有副作用,因为每个操作都需要时间,每个新创建的对象都会减少可用内存量,等等。甚至没有Haskell 可以避免这种情况。我认为对于 Scala 中的哪些副作用“计数”和哪些“不计数”有一些约定。由于.empty 创建的对象不打算保留.equal,我猜想 that 会算作副作用。好像没有?
    • 我在任何地方都没有看到这一点,但我的解释是,如果你有一个返回可变对象的方法,那么引用透明度显然会消失。但是创建可变对象的函数仍然被认为是“无副作用的”,因为它除了产生返回值之外什么都不做。如果你想争论纯度,你绝对不应该在 JVM 上考虑的方法肯定是 eq、ne、System.identityHashCode 和所有其他低级方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2018-01-29
    相关资源
    最近更新 更多