斯卡拉 2.9 : plans for type inference of function parameters with default arguments?

标签 scala parameters default-value type-inference type-erasure

我刚刚开始使用 Scala。我一直在使用 Python 进行研究编程,并且正在转换一个相当大的(约 4000 行)Python 程序。

几点评论:

  • 现在是参与 Scala 的最佳时机,因为 2.8 中添加了很多好东西。
  • 另一方面......我想知道为什么 Scala 似乎没有像样的 IO 包,以及为什么这似乎不是优先事项。在大多数语言中,IO 被认为是最基本的操作之一,并且语言的某些部分通常是专门设计的,因此 IO 可以很好地工作。例如,Python 中的 IO 库似乎是该语言中最古老、最稳定的部分之一(至少在其接口(interface)中)。然而,两年前的评论说“Source.fromFile() 是一个大规模的黑客攻击,等到某某完成新的 IO 包”——我认为没有任何进展。更糟糕的是 Source.fromFile().getLines() —— 无论是否破解,通常都是宣传的接口(interface)—— 是 完全坏了通过 2.9.0.1 中的更改(参见 https://issues.scala-lang.org/browse/SI-4662 )。显然,对于这个最基本的 IO 接口(interface),根本没有回归测试,这是一个不好的迹象。
  • 类型删除非常糟糕,以至于我真的想知道为什么在 Scala 中决定坚持使用它。是的,我知道 Java 有类型删除,而 Scala 是基于 JVM 构建的,但是因此需要添加明确可见的东西,例如manifests, specialization annotations, etc. etc. etc. to work around type erasure just doesn't really bad ...然后有很多不需要的东西要弃用。

  • 我的问题是:

    是否有计划为具有默认参数的函数参数添加类型推断?写这样的东西有点烦人:
      def add_words(words:Traversable[String], ignoreCase:Boolean=true,
                    stopwords:Set[String]=Set[String]()) {
        ...
      }
    

    在这种情况下,根本不需要 ignoreCase 和停用词上的类型注释,它们只是增加了不必要的冗长。

    感谢参与 Scala 开发的人员的任何评论。

    最佳答案

  • Scala 已经添加了很长一段时间的好东西,但随着它的普及,它会变得越来越稳定。 2.8 之前的人在修改语言方面比现在的人有更多的影响力——既因为他们代表了更大比例的用户,也因为语言更灵活。

    以您的删除问题为例。作为 2.0 的用户,您将有比现在更大的机会来完成它。事实上,兼容性方面的影响几乎可以保证它不会再发生,除非 Java 领先。
  • 您来自脚本语言。脚本语言非常关心 I/O,因为那是他们的黄油和面包。对于 Scala,任何严肃的 I/O 都简单地归入 Java 库——毕竟,这就是让 Scala 与 Java 兼容的意义所在。

    此外,您对 4662 的描述实际上是完全错误的。它根本没有被破坏,尽管行为的改变使得可以说不正确的代码再次工作。简而言之,这是 4662:
    val source = scala.io.Source.fromFile(new java.io.File("test1.file"))
    use(source)
    val lines = source.getLines
    

    由于sourceIterator ,一旦使用就消失了。巧合的是,您可以在调用 toString 后重复使用它。就可以了,不是内在保证。
  • 类型删除还不错。事实上,如果它妨碍了它是糟糕设计的标志——你不应该检查某物的类型,而是调用它的方法并让它自己处理。并不是说它有时不烦人,但也不是那么糟糕。唉,它是与 Java 无缝兼容的基本选择,而且是非常有意识地做出的。我没有看到 Scala 引领潮流。

    Ceylon 是 promise 摆脱删除并保持与 Java 兼容性的新语言之一。如果 Ceylon 能够做到这一点,并且我坚定地站在怀疑者阵营中,那么 Scala 可以跟进。

    此外,在最近对 Java 8 闭包的讨论中,表明有可能对删除做一些事情。如果事实证明这是真的,那么 Scala 也可以兑现。

  • 至于这个问题,我同意可以推断出这些类型。但是,我不确定是否有人使用默认参数做某事——目前的优先事项在别处。

    关于斯卡拉 2.9 : plans for type inference of function parameters with default arguments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158386/

    相关文章:

    function - 无法在函数的Where-Object 中使用变量

    c++ - 使用模板时得到 "cannot appear in a constant-expression"

    mysql - 在数据库中存储默认值的最佳方法是什么?

    如果找不到行,SQL 返回默认值 [PostgreSQL]

    Laravel 4 - 隐式 Controller 中的 URI 参数

    scala - 有没有办法让 Scala REPL 不停止 CTRL-C

    scala - sbt Project name must be valid Scala identifier 创建新项目时出错

    mysql - 如何在 Slick 2 中的连接表上使用字段和计数 (*) 进行排序?

    c# - 设置 DateTimePicker 的默认值

    java - 将 Unicode (CJK ExtB) 字符转换为 Java/Scala 中的十进制 NCR