4

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

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

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

4

2 回答 2

4

它实际上是一种相当复杂的类型,由于多种原因很难正式定义:

  • 它是一个多参数函数(接受可变数量的参数)。请注意,这与采用单个参数的函数不同,该参数是数字列表。如果您想在+需要使用的数字列表中使用,apply例如(apply + [1 2 3 4])
  • 每个参数可以是Number任何类型的。有许多可能的数字类型,实际上任何扩展java.lang.Number基类的东西就足够了。
  • 定义的内联版本可以直接生成原始类型。

没有一种简单的方法可以从 REPL 中确定这一点。但是您可能对Typed Clojure感兴趣,它提供了一个类型系统以及定义类型和在 Clojure 中进行相应类型检查的方法。它使用一种称为“渐进式键入”的简洁方法,因此您可以在需要的地方添加类型注释:您不需要一次将类型分配给整个程序。

于 2012-12-26T11:03:41.010 回答
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

因此,该函数根据参数+返回 aLong或 a 。Double

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

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

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

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

如果你想看看这个功能是如何实现的,就像访问源代码一样简单。这使您可以了解如何定义多参数函数。

于 2012-12-26T10:52:03.027 回答