0 赞 0 踩
其他回答
开一个吐槽贴。以下主要是我自己编程实践中遇到的问题。
虽然吐槽了这么多,Scala 还是甩 Java、C#、Python、JS、Ruby 等等好几条街的。
1. 高阶类型 lambda 表达式语法丑陋
2. 类型组合的 with 操作符不满足交换律
3. 不允许自定义含多个域的值类型(类似 C# 的 struct)
这个应该是 JVM 的缺陷导致的。这个问题导致 Option[+A]、Complex 这些小的不可变的对象每次都要产生额外的解引用操作,影响效率。
4. 没有 C#、Python 里的 yield 操作符
有了这个构造惰性流会方便得多。
写一个惰性的深度优先搜索要这样:
5. 不能单独构造没有 getter 的 setter 热心网民 2小时前 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 踩
登录后可回答 提交回答
关键词 :
- 上一个:跨专业考研,今后想从心理咨询和培育的办事,摘学术硕士好,还是规范硕士好?
- 下一个:CLDNN 模型是同种什么的思考?为什么它的效果要优化 DNN?
推荐资讯
点击排行