# 033: Prelude における Num クラスとインスタンスを完成させる [↑up](bunny_notes) - issued: 2020-04-15 - 分類: B 機能追加 - status: Closed (2021-10-31) ## 調査ログ ### 2020-05-09 [058](bissue058) を閉じるためにも、div を実装しよう。 まず、class (Num a, Ord a) => Read a where ... と書いた時点でエラー。 Rename.renClassDecls で super class が2つ以上に対応していなかった。 しかし、いまは、まだ Int と Integer しかないので、Enum のみのサブクラスとして Integral を実装するしかないな。 Double, Float も実装。 ## 2021-10-27 状況整理しよう。 参照するのは、Haskell 2010 language report の [Standard Prelude](https://www.haskell.org/onlinereport/haskell2010/haskellch9.html#x16-1710009) で、 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](bissue018) なので) ## 2021-10-31 RealFloat のインスタンス Float, Double の定義を完了。 これの疎通試験を sample333.hs としてテストに追加。 この issue はこれでクローズ。