Haskell での Num の型クラスの関係がよくわからなかったので調べた

@alphaneet さんが Haskell の勉強の様子を Ust してた

Haskell 勉強したい、勉強したい」といいながら、結局最近あまりやれていないのを思い出し、自分もおもむろに ghci を立ち上げてみる

let f 0 = 1

というとても単純な関数を定義してみる。

:type コマンドでそれの型を調べたら

f :: (Eq a, Num a, Num a1) => a -> a1

ってなってる。

あれ alphaneet さんのやつと違う・・・?ちなみに自分が今試していたのは 7.3.20111021 (このとき入れたもの)

なぜか自分のPCに古いversion (6.12.1) のghciも入ってる

そっちで試すと

f :: (Num t, Num t1) => t -> t1

ってなってる。

あれ Eq の Instance が必要かどうかが異なってる・・・(´・ω・`)?

:info コマンドで、Num や Eq や Integer について調べる

以下のように Num が Eq の instance かどうかが異なってる

古い

Prelude> :info Num
class (Eq a, Show a) => Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
        -- Defined in GHC.Num
instance Num Integer -- Defined in GHC.Num
instance Num Int -- Defined in GHC.Num
instance Num Float -- Defined in GHC.Float
instance Num Double -- Defined in GHC.Float

新しい

class Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
        -- Defined in `GHC.Num'
instance Num Integer -- Defined in `GHC.Num'
instance Num Int -- Defined in `GHC.Num'
instance Num Float -- Defined in `GHC.Float'
instance Num Double -- Defined in `GHC.Float'

あーなるほど・・・(・ω・`)なんとなくわかった・・・?

さらにこれが切り替わったversionとか、切り替わった理由、(いやまてそもそも本当に設計が変わったのか? じぶんが単純なミスをしているだけなのか) を気になって調べる

でもすぐに見つからなかったので諦めて、とりあえずアウトプットするためblog書いた ← イマココ

ここから追記

しぇらーしぃ さんからこの時点でreplyきていたのに気づいていない状態↑ すいません・・・

しぇらーしぃさんありがとうございます。めでたしめでたし・・・?
せっかくなので、紹介されたリンク先を全部理解できなくてもいいからちょっと読もう・・・