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