Scala 的语言设计出什么缺陷?

发布日期:2018-06-02 来源:财富国际在线 阅读:
Scala 的语言设计出什么缺陷? Geek.cs 3小时前 182
0 0
其他回答
开一个吐槽贴。以下主要是我自己编程实践中遇到的问题。
虽然吐槽了这么多,Scala 还是甩 Java、C#、Python、JS、Ruby 等等好几条街的。

1. 高阶类型 lambda 表达式语法丑陋
FactoryEv[({type λ[K] = Multiset[K, R]})#λ, Eq]
简直是不能忍。如果能像下面这样多好:
FactoryEv[K => Multiset[K, R], Eq]
GitHub - non/kind-projector 能部分缓解这个问题。

2. 类型组合的 with 操作符不满足交换律
trait A { def f: A }trait B { def f: B }trait AB extends A with B // AB.f 的类型是 Btrait BA extends B with A // BA.f 的类型是 A
此问题有待 Dotty 中加入的交类型(intersection type)和并类型(union type)解决。

3. 不允许自定义含多个域的值类型(类似 C# 的 struct)
这个应该是 JVM 的缺陷导致的。这个问题导致 Option[+A]、Complex 这些小的不可变的对象每次都要产生额外的解引用操作,影响效率。

4. 没有 C#、Python 里的 yield 操作符
有了这个构造惰性流会方便得多。
写一个惰性的深度优先搜索要这样:
def depthFirstSearch[N](start: N, succ: N => Traversable[N]) = new Iterable[N] {  def iterator = new Iterator[N] {    private[this] val s = ArrayStack[N](start);    def hasNext = !s.isEmpty    def next() = {      val curr = s.pop()      for (x <- succ(curr)) s.push(x)      curr  }}
而 C#:
IEnumerable<N> DepthFirstSearch(N start, Func<N, IEnumerable<N>> succ) {  var s = new Stack<N>();  s.Push(start);  while (!s.IsEmpty()) {    var curr = s.Pop();    yield return curr;    for (N next in succ(curr)) s.Push(next);  }}

5. 不能单独构造没有 getter 的 setter
热心网民 2小时前 0条评论
0 0
Martin Odersky是个教授 手下带了不少研究生 研究生为了毕业 一定得搞点什么成果 主要就是给scala加feature 等研究生毕业了 这些feature基本上就没人管了 最后就成了现在这个样子 热心网民 2小时前 0条评论
0 0

关于我们 联系我们招聘信息免责申明广告服务 网站地图 百度地图 TAG标签

Copyright@2018-2022 Cfgjzx.Com 财富国际在线 版权所有 All Rights Reserved   
财富国际提供:最新财富资讯、房产资讯、股票资讯、区块链、投资理财、保险导购、健康产品、公私募基金,易经等资讯及服务.