我知道 Lisps(通常)是动态类型的,但我猜它们的值仍然有类型。函数是 lisps 中的值,所以我想知道函数的类型是+
什么?
List of numbers -> number
似乎最有可能,所以我在 Clojure 中尝试过(+ '(2 3))
,(+ [2 3])
但都没有奏效。
是否可以在 Clojure REPL 中查询值(或表达式)的类型?
它实际上是一种相当复杂的类型,由于多种原因很难正式定义:
+
需要使用的数字列表中使用,apply
例如(apply + [1 2 3 4])
Number
任何类型的。有许多可能的数字类型,实际上任何扩展java.lang.Number
基类的东西就足够了。没有一种简单的方法可以从 REPL 中确定这一点。但是您可能对Typed Clojure感兴趣,它提供了一个类型系统以及定义类型和在 Clojure 中进行相应类型检查的方法。它使用一种称为“渐进式键入”的简洁方法,因此您可以在需要的地方添加类型注释:您不需要一次将类型分配给整个程序。
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
因此,该函数根据参数+
返回 aLong
或 a 。Double
其他算术函数也根据参数返回不同的类型:
> (type (/ 3 1))
java.lang.Long
> (type (/ 3.0 1))
java.lang.Double
> (type (/ 1 3))
clojure.lang.Ratio
如果你想看看这个功能是如何实现的,就像访问源代码一样简单。这使您可以了解如何定义多参数函数。