Clojure(或任何其他Lisp)中+函数的类型是什么?

时间:2012-12-26 10:46:58

标签: clojure lisp

我理解Lisps(通常)是动态类型的,但我猜他们的值仍然有类型。函数是lisps中的值,所以我想知道函数+的类型是什么?

List of numbers -> number似乎最有可能,所以我在Clojure中尝试(+ '(2 3))(+ [2 3]),但都没有效果。

是否可以在Clojure REPL中查询值(或表达式)的类型?

2 个答案:

答案 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

因此,+函数会返回LongDouble,具体取决于参数。

其他算术函数也会根据参数返回不同的类型:

> (type (/ 3 1))
java.lang.Long

> (type (/ 3.0 1))
java.lang.Double

> (type (/ 1 3))
clojure.lang.Ratio

如果您想了解该功能的实现方式,就像visiting the source一样简单。这使您可以了解如何定义多个功能。