Lisp は (通常) 動的に型付けされることは理解していますが、それらの値にはまだ型があると思います。関数はLispの値なので、関数のタイプは何+
ですか?
List of numbers -> number
最も可能性が高いと思われたので、Clojure で試し(+ '(2 3))
てみましたが、どちらも機能しませんでした。(+ [2 3])
Clojure REPL で値 (または式) の型を照会することは可能ですか?
これは実際には非常に複雑な型であり、いくつかの理由から正式に定義するのは難しいです:
+
使用する必要がありますapply
(apply + [1 2 3 4])
Number
、任意の型にすることができます。多くの可能な数値型があり、java.lang.Number
基本クラスを拡張するものであれば何でも十分です。これを REPL から判断する簡単な方法はありません。しかし、Clojureで型を定義し、対応する型チェックを行うためのメソッドと共に型システムを提供するTyped 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
したがって、関数は引数に応じてaまたは a を+
返します。Long
Double
他の算術関数も、引数に応じて異なる型を返します。
> (type (/ 3 1))
java.lang.Long
> (type (/ 3.0 1))
java.lang.Double
> (type (/ 1 3))
clojure.lang.Ratio
関数がどのように実装されているかを確認したい場合は、ソースにアクセスするのと同じくらい簡単です。これにより、マルチアリティ関数を定義する方法を確認できます。