とは書いたけれど、ここは今までの復習になりそう。
今まで扱ってきた型は特殊なもので、一般的に使われるものでもあるんだ。
つまり、数値、文字列、ブール値だ。
数値はNumクラスとしてまとめられて、使用する用途によって、いずれかの型になる。
Prelude> :t 100
100 :: (Num t) => t
普通に数値を書くと、具体的な型は決められない。
Prelude> 100::Int
100
明示してやると、その型になる。といっても、見た目は変わらないけど。
Prelude> 7000000000::Int
-1589934592
Intは小さい数値を表す型だろうから、と思って大きな値を使ってみた。
ここでわかるのは、評価器は、型が合いそうなら平気で変換すること、そして、その結果に無頓着であることだ。
こんな使い方はエラーの原因になるので注意してね。
Prelude> 7000000000::Double
7.0e9
他の型なら大丈夫そう。
Prelude> :t "String"
"String" :: [Char]
Prelude> :i String
type String = [Char] -- Imported from GHC.Base
文字列は文字の
リストの言い換えなんだよね。文字も特殊なもので、次のように表せる。
Prelude> :t 'a'
'a' :: Char
あるいは、こう。文字コードで表せる。
Prelude> :t '\97'
'\97' :: Char
Prelude> '\97'
'a'
そして、ブール値だ。haskellで扱う型は、一般的にはこの形をしている。と思う。
Prelude> True
True
Prelude> :t True
True :: Bool
Prelude> :i Bool
data Bool = False | True -- <wired into compiler>
instance Bounded Bool -- Imported from GHC.Enum
instance Enum Bool -- Imported from GHC.Enum
instance Eq Bool -- Imported from GHC.Base
instance Ord Bool -- Imported from GHC.Base
instance Read Bool -- Imported from GHC.Read
instance Show Bool -- Imported from GHC.Show
型構築子、あるいは型構築子+値の形をしている。
そして、型は:i以下のように宣言されている。
代表的な型はこのくらいだ。
他にも、よく使われる型があるけど、ここでは紹介だけに留めておく(なぜなら、詳細を知らないから)。
Prelude> :i IO
newtype IO a
= IO (GHC.Prim.State# GHC.Prim.RealWorld
-> (# GHC.Prim.State# GHC.Prim.RealWorld, a #))
-- Imported from GHC.IOBase
instance Monad IO -- Imported from GHC.IOBase
instance Functor IO -- Imported from GHC.IOBase
Prelude> :i Maybe
data Maybe a = Nothing | Just a -- Imported from Data.Maybe
instance Eq a => Eq (Maybe a) -- Imported from Data.Maybe
instance Monad Maybe -- Imported from Data.Maybe
instance Functor Maybe -- Imported from Data.Maybe
instance Ord a => Ord (Maybe a) -- Imported from Data.Maybe
instance Read a => Read (Maybe a) -- Imported from GHC.Read
instance Show a => Show (Maybe a) -- Imported from GHC.Show
うーん、全く分からないわけでもないかな。
とりあえず、
多重定義の知識は必要なので、こちらへ誘導するよ。
最終更新:2007年09月28日 20:17