我知道 Lisp(通常)是动态类型的,但我猜它们的值仍然有类型。函数是 lisp 中的值,所以我想知道函数 +
的类型是什么?
List of numbers -> number
似乎最有可能,所以我尝试了 (+ '(2 3))
和 (+ [2 3])
在 Clojure 中,但均无效。
是否可以在 Clojure REPL 中查询值(或表达式)的类型?
最佳答案
它实际上是一个非常复杂的类型,由于多种原因很难正式定义:
- 这是一个多元函数(接受可变数量的参数)。请注意,这与采用单个参数(即数字列表)的函数不同。如果你想在数字列表上使用
+
,你需要使用apply
例如(申请 + [1 2 3 4])
- 每个参数可以是任何类型的
数字
。有许多可能的数字类型,实际上是任何扩展java.lang.Number
的数字类型。基类就足够了。 - 内联版本被定义为可以直接生成原始类型作为结果。
没有一种简单的方法可以从 REPL 中确定这一点。但您可能对 Typed Clojure 感兴趣它提供了一个类型系统以及在 Clojure 中定义类型和进行相应类型检查的方法。它使用一种称为“渐进类型”的巧妙方法,因此您可以在需要的地方添加类型注释:您不需要立即为整个程序分配类型。
关于clojure - Clojure(或任何其他 Lisp)中 + 函数的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039512/