058 を閉じるためにも、div を実装しよう。
まず、class (Num a, Ord a) => Read a where ... と書いた時点でエラー。 Rename.renClassDecls で super class が2つ以上に対応していなかった。
しかし、いまは、まだ Int と Integer しかないので、Enum のみのサブクラスとして Integral を実装するしかないな。
Double, Float も実装。
状況整理しよう。
参照するのは、Haskell 2010 language report の Standard Prelude で、 bunny においては、lib/Prelude.hs に実装が書かれる。
Num クラスは現状以下のように書かれていて、仕様通り:
class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs, signum :: a -> a fromInteger :: Integer -> a -- Minimal complete definition: -- All, except negate or (-) x - y = x + negate y negate x = 0 - x
Real, Integral, Fractional, Floating も仕様通りにかかれている。
RealFrac は、round の定義が仕様とすこし違う書き方になっている。 なにか問題を回避したのかな(覚えてない)
class (Real a, Fractional a) => RealFrac a where properFraction :: (Integral b) => a -> (b, a) truncate, round :: (Integral b) => a -> b ceiling, floor :: (Integral b) => a -> b -- Minimal complete definition: properFraction truncate x = m where (m, _) = properFraction x round x = let (n, r) = properFraction x m = if r < 0 then n - 1 else n + 1 s = signum (abs r - 0.5) in if (s == -1) || (s == 0 && even n) then n else m ceiling x = if r > 0 then n + 1 else n where (n, r) = properFraction x floor x = if r < 0 then n - 1 else n where (n, r) = properFraction x
Numeric Functions はそろっている。
RealFloat クラスを定義して、Double, Float をそのインスタンスにすれば、ひとまず完成かな。 (Ratio は別チケット 108 なので)
RealFloat のインスタンス Float, Double の定義を完了。 これの疎通試験を sample333.hs としてテストに追加。
この issue はこれでクローズ。