valid,invalid

関心を持てる事柄について

Clojure で分数を扱う Ratio 型

Clojure では分数を扱う Ratio 型がある。

とりあえず見てみる

user=> (/ 22 7)
22/7

user=> (class (/ 22 7))
clojure.lang.Ratio

型変換

Integer や Float にいつでも変換できる。

user=> (int (/ 22 7))
3

user=> (float (/ 22 7))
3.142857

有理数

rationalize は面白い。引数を有理数に変換するのだが、返り値は様々。

user=> (rationalize 1.5)
3/2

user=> (class (rationalize 1.5))
clojure.lang.Ratio

user=> (rationalize 1N)
1N

user=> (class (rationalize 1N))
clojure.lang.BigInt

user=> (rationalize 1.00)
1N

user=> (class (rationalize 1.00))
clojure.lang.BigInt

user=> (rationalize 1)
1

user=> (class (rationalize 1))
java.lang.Long

user=> (rationalize 4/2)
2

user=> (class (rationalize 4/2))
java.lang.Long

test

test する関数は ratio?rational? がある。

user=> (doc ratio?)
-------------------------
clojure.core/ratio?
([n])
  Returns true if n is a Ratio ;; 型が Ratio のときのみ true

user=> (ratio? 4/3) ;; Ratio
true

user=> (ratio? 4/2) ;; これは Long
false

user=> (ratio? 2) ;; Long
false

user=> (ratio? 2.0) ;; Double
false
user=> (doc rational?)
-------------------------
clojure.core/rational?
([n])
  Returns true if n is a rational number ;; 有理数であれば true なので整数(Long)にも true を返す

user=> (rational? 4/3)
true

user=> (rational? 4/2)
true

user=> (rational? 2)
true

user=> (rational? 2.0)
false