我理解Lisps(通常)是动态类型的,但我猜他们的值仍然有类型。函数是lisps中的值,所以我想知道函数+
的类型是什么?
List of numbers -> number
似乎最有可能,所以我在Clojure中尝试(+ '(2 3))
和(+ [2 3])
,但都没有效果。
是否可以在Clojure REPL中查询值(或表达式)的类型?
答案 0 :(得分:4)
这实际上是一个非常复杂的类型,由于多种原因正式定义是很棘手的:
+
,则需要使用apply
,例如(apply + [1 2 3 4])
Number
。有许多可能的数字类型,实际上扩展java.lang.Number
基类的任何东西都足够了。从REPL中确定这一点并不容易。但您可能对Typed Clojure感兴趣,它提供了一个类型系统以及定义类型的方法,并在Clojure中进行相应的类型检查。它使用一种称为“渐进式”的简洁方法,因此您可以在需要的地方添加类型注释:您不需要一次为整个程序分配类型。
答案 1 :(得分:1)
Clojure具有type
功能。
> (type +)
clojure.core$_PLUS_
> (type clojure.core$_PLUS_)
java.lang.Class
> (type (+ 1 1))
java.lang.Long
> (type (+ 1.0 1.0))
java.lang.Double
因此,+
函数会返回Long
或Double
,具体取决于参数。
其他算术函数也会根据参数返回不同的类型:
> (type (/ 3 1))
java.lang.Long
> (type (/ 3.0 1))
java.lang.Double
> (type (/ 1 3))
clojure.lang.Ratio
如果您想了解该功能的实现方式,就像visiting the source一样简单。这使您可以了解如何定义多个功能。