scala 2.9:使用默认参数对函数参数进行类型推断的计划?

Urb*_*ond 5 parameters scala type-inference default-value type-erasure

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

一些评论:

  1. 看起来是参与Scala的最佳时机,因为2.8中添加了很多好东西.
  2. 另一方面......我想知道为什么Scala似乎没有一个像样的IO包,为什么这似乎不是一个优先事项.在大多数语言中,IO被认为是最基本的操作之一,并且语言的一部分通常是专门设计的,因此IO运行良好.例如,Python中的IO库似乎是该语言中最古老,最稳定的部分之一(至少在其界面中).然而,两年前的评论说"Source.fromFile()是一个大规模的黑客攻击,等到某某完成新的IO包" - 我认为没有动作完成这个.更糟糕的是,Source.fromFile().getLines() - 其中,黑客与否,是一般广告界面 - 完全被 2.9.0.1中的更改​​打破(参见https://issues.scala- lang.org/browse/SI-4662).显然,对于这个最基本的IO接口,根本没有回归测试,这是一个不好的迹象.
  3. 类型擦除非常糟糕,以至于我真的想知道为什么在Scala中决定坚持使用它.是的,我知道Java有类型擦除,而Scala是在JVM上构建的,但最终需要添加明显可见的东西,如清单,专业化注释等,以解决类型擦除只是闻起来很糟糕...我最终感觉Scala设计师将意识到所有这些的愚蠢,并被迫实施适当的通用类型,此时他们将那么有很多不必要的东西要弃用.

我的问题是:

是否计划使用默认参数为函数参数添加类型推断?写这样的东西有点烦人:

  def add_words(words:Traversable[String], ignoreCase:Boolean=true,
                stopwords:Set[String]=Set[String]()) {
    ...
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,根本不需要对ignoreCasestopwords进行类型注释,它们只是添加了不必要的详细程度.

感谢参与Scala开发的人员提出的任何意见.

Dan*_*ral 5

  1. Scala在很长一段时间内都添加了很多东西,但随着它越来越受欢迎,它将变得越来越稳定.2.8之前的人在修改语言方面比现在的人更有影响力 - 因为他们代表了更大比例的用户,并且因为语言更灵活.

    以你的擦除问题为例.作为一个2.0用户,你有比现在更大的机会完成任务.事实上,除非Java领先,否则兼容性的影响几乎可以保证它不会再发生.

  2. 你来自脚本语言.脚本语言非常关注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
    
    Run Code Online (Sandbox Code Playgroud)

    既然sourceIterator,它一旦你使用它就消失了.这是巧合,您可以在调用它之后重复使用toString它,而不是内在的保证.

  3. 类型擦除并不是那么糟糕.事实上,如果它有很多障碍,它就是糟糕设计的标志 - 你不应该检查什么类型的东西,而是调用它上面的方法并让它自己处理.不是说它有时不烦人,但不是那么糟糕.唉,它是与Java无缝兼容的基本选择,而且它是非常有意识的.我没有看到Scala引领它.

    Ceylon是一种承诺消除擦除并与Java保持兼容的新语言.如果锡兰能够做到这一点,而且我坚定地站在怀疑者阵营,那么Scala就可以效仿.

    此外,最近关于Java 8闭包的讨论表明可能会对擦除做些什么.如果事实证明是真的,那么Scala也可以兑现.

至于这个问题,我同意可以推断出这些类型.我不确定是否有人在使用默认参数做某事 - 但目前的优先事项还在于其他地方.