色々な型

とは書いたけれど、ここは今までの復習になりそう。

今まで扱ってきた型は特殊なもので、一般的に使われるものでもあるんだ。
つまり、数値、文字列、ブール値だ。

数値は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