4

Lisp は (通常) 動的に型付けされることは理解していますが、それらの値にはまだ型があると思います。関数はLispの値なので、関数のタイプは何+ですか?

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 から判断する簡単な方法はありません。しかし、Clojureで型を定義し、対応する型チェックを行うためのメソッドと共に型システムを提供するTyped 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

したがって、関数は引数に応じてaまたは a を+返します。LongDouble

他の算術関数も、引数に応じて異なる型を返します。

> (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 に答える