昨日はGHCiでの複数行の入力と、オフサイドルールについて説明した。
今日は、GHCiでの型などの宣言と、型や識別子、モジュールの調査について。
GHCiでの型などの宣言
GHCiでは、普通のHaskellのソースコードと同じように、型や型クラスを宣言したり、型クラスのインスタンスを宣言することが出来る。
例えば、二分木を表すTree aという型を宣言してみると、以下のようになる:
Prelude> :{ Prelude| data Tree a = Leaf { element :: a } Prelude| | Fork { element :: a Prelude| , left :: Tree a Prelude| , right :: Tree a Prelude| } Prelude| deriving (Show) Prelude| :} Prelude> :{ Prelude| let tree = Prelude| Fork { element = 1 Prelude| , left = Fork { element = 2 Prelude| , left = Leaf { element = 3 } Prelude| , right = Leaf { element = 4 } Prelude| } Prelude| , right = Leaf { element = 5 } Prelude| } Prelude| :} Prelude> tree Fork {element = 1, left = Fork {element = 2, left = Leaf {element = 3}, right = Leaf {element = 4}}, right = Leaf {element = 5}} Prelude>
型や識別子、モジュールの調査
GHCiでは、式の型や識別子の情報、そして、モジュールの情報を見ることが出来る。
まず、式の型を見る方法。
これには、:type
コマンド(省略形は:t
)を使う。
Prelude> :t 1 1 :: Num a => a Prelude> :t "Hi!" "Hi!" :: [Char] Prelude> :t [1..] [1..] :: (Enum t, Num t) => [t] Prelude> :t 1 + 2 1 + 2 :: Num a => a Prelude> :t show show :: Show a => a -> String Prelude> :t (+) (+) :: Num a => a -> a -> a Prelude> :t Fork Fork :: a -> Tree a -> Tree a -> Tree a Prelude> :t map (+2) map (+2) :: Num b => [b] -> [b] Prelude>
なお、演算子については、括弧で囲って関数にしないとダメ。
次に、識別子の情報を見る方法。
これには、:info
コマンド(省略形は:i
)を使う。
Prelude> let a = 1 Prelude> :i a a :: Num a => a -- Defined at <interactive>:74:5 Prelude> let str = "hello" Prelude> :i str str :: [Char] -- Defined at <interactive>:75:5 Prelude> let f = \x -> x * x Prelude> :i f f :: Num a => a -> a -- Defined at <interactive>:78:5 Prelude> :i Tree data Tree a = Leaf {element :: a} | Fork {element :: a, left :: Tree a, right :: Tree a} -- Defined at <interactive>:18:1 instance Show a => Show (Tree a) -- Defined at <interactive>:23:23 Prelude> :i Fork data Tree a = ... | Fork {...} -- Defined at <interactive>:19:15 Prelude> :i (+) class Num a where (+) :: a -> a -> a ... -- Defined in ‘GHC.Num’ infixl 6 + Prelude> :i Num 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 Word -- 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’ Prelude>
最後に、モジュールの情報を見る方法。
これには、:browse
コマンドを使う。
Prelude> :browse Data.Maybe Data.Maybe.catMaybes :: [Maybe a] -> [a] Data.Maybe.fromJust :: Maybe a -> a Data.Maybe.fromMaybe :: a -> Maybe a -> a Data.Maybe.isJust :: Maybe a -> Bool Data.Maybe.isNothing :: Maybe a -> Bool Data.Maybe.listToMaybe :: [a] -> Maybe a Data.Maybe.mapMaybe :: (a -> Maybe b) -> [a] -> [b] maybe :: b -> (a -> b) -> Maybe a -> b Data.Maybe.maybeToList :: Maybe a -> [a] data Maybe a = Nothing | Just a Prelude>
なお、:browse!
コマンドを使うことも出来て、そうした場合、値コンストラクタも個別に表示され、また、グループ分けして表示される。
Prelude> :browse! Data.Maybe -- not currently imported Data.Maybe.catMaybes :: [Maybe a] -> [a] Data.Maybe.fromJust :: Maybe a -> a Data.Maybe.fromMaybe :: a -> Maybe a -> a Data.Maybe.isJust :: Maybe a -> Bool Data.Maybe.isNothing :: Maybe a -> Bool Data.Maybe.listToMaybe :: [a] -> Maybe a Data.Maybe.mapMaybe :: (a -> Maybe b) -> [a] -> [b] Data.Maybe.maybeToList :: Maybe a -> [a] -- imported via Prelude maybe :: b -> (a -> b) -> Maybe a -> b Just :: a -> Maybe a data Maybe a = Nothing | Just a Nothing :: Maybe a Prelude>
今日はここまで!