我听说有人声称:
Scala的类型系统是惊人的(存在类型,变体,共变体)
由于宏的强大功能,一切都是Clojure中的库:(模式匹配,逻辑编程,非确定性,......)
题:
如果两个断言都是真的,为什么Scala的类型系统不是Clojure中的库?是因为:
类型是这些不适合作为库的东西之一?[即改变会以某种方式穿过每个现有的clojure库,包括clojure.core?]
Scala的类型概念是否与clojure协议/记录根本不兼容?
......?
mik*_*era 12
这是一个有趣的问题.
你肯定对Scala有一个惊人的类型系统是正确的,并且关于Clojure对于元编程和语言的扩展是惊人的(尽管这不仅仅是宏......).
我能想到的几个原因:
在没有对Clojure本身进行重大更改(我认为不太可能)的情况下,一个有趣的可能性是在Clojure中创建一个DSL,为特定域提供Scala样式类型推断并将此DSL直接编译为优化的Java字节码.我可以看到,对于特定问题域(例如,使用大矩阵进行大规模数值数据处理)是一种有用的方法.
简单地回答你的问题"......为什么Scala的类型系统不是Clojure中的库?":
因为类型系统是scala编译器的一部分而不是scala库的一部分.scalas类型系统的全部功能仅存在于编译时.由于类型擦除,JVM不支持这样的事情,因为它只会减慢执行速度.而且也没有必要.如果你有一个静态类型的语言,你不需要在运行时输入类型信息,除非你想做脏东西.
编辑:
@mikera jvm肯定能够运行scala编译器,我没有说那样的话.我只是说,jvm不支持类似的类型系统.它甚至不支持泛型.在运行时,所有这些类型都消失了.编译器检查程序的正确性并删除所有较高级别的类型/泛型.
例:
val xs: List[Int] = List(1,2,3,4)
val x1: Int = xs.head
Run Code Online (Sandbox Code Playgroud)
将在运行时看起来像这样:
val xs: List = List.apply(1,2,3,4)
val x1: Int = xs.head.asInstanceOf[Int]
Run Code Online (Sandbox Code Playgroud)
但这没关系,因为编译器之前已经检查过它.当你使用反射时,你只能在这里遇到麻烦,因为你可以在列表中放置任何值,并且它会在运行时准确地在值被转换到的位置中断Int.
这就是为什么scala类型系统不是scala库的一部分,而是内置到编译器中的原因之一.
而且OP的问题是"......为什么Scala的类型系统不是Clojure中的库?" 而不是"是否有可能为clojure创建一个类型系统,如scalas?" 我完全回答了这个问题.
| 归档时间: |
|
| 查看次数: |
814 次 |
| 最近记录: |