プログラミングHaskell 第3章 型とクラス
表題の通り型とクラスについて書かれていた。
何だかしっくりこない。簡単のために端折って書いているのか?以降の章を読めば理解できるのか?モヤモヤする。他の資料も参照してみる事にする。
特に3 :: Num a => a
のくだりがよくわからん。
練習問題の解答
1
['a', 'b', 'c'] :: [Char] ('a', 'b', 'c') :: (Char, Char, Char) [(False, '0'), (True, '1')] :: [(Bool, Char)] ([False, True], ['0', '1']) :: ([Bool], [Char]) [tail, init, reverse] :: [[a] -> [a]]
2
second :: [a] -> a swap :: (a, b) -> (b, a) pair :: a -> b -> (a, b) double :: Num a => a -> a -- 間違えた。リストの同等判定を行うので、Eqクラスの成約が必要だった。 -- 正解:palindrome :: Eq a => [a] -> Bool palindrome :: [a] -> Bool -- ここも間違えた。(f x)は再びfの引数になるので、f :: a -> aだった。 -- 正解:twice :: (a -> a) -> a -> a twice :: (a -> b) -> a -> b
3
-- 2の:tコマンドによる確認結果 *Main> :t ['a', 'b', 'c'] ['a', 'b', 'c'] :: [Char] *Main> :t ('a', 'b', 'c') ('a', 'b', 'c') :: (Char, Char, Char) *Main> :t [(False, '0'), (True, '1')] [(False, '0'), (True, '1')] :: [(Bool, Char)] *Main> :t ([False, True], ['0', '1']) ([False, True], ['0', '1']) :: ([Bool], [Char]) *Main> :t [tail, init, reverse] [tail, init, reverse] :: [[a] -> [a]] -- 2の:tコマンドによる確認結果 *Main> :t second second :: [a] -> a *Main> :t swap swap :: (t1, t) -> (t, t1) *Main> :t pair pair :: t -> t1 -> (t, t1) *Main> :t double double :: Num a => a -> a *Main> :t palindrome palindrome :: Eq a => [a] -> Bool *Main> :t twice twice :: (t -> t) -> t -> t
4
関数の同等性を検証するには、引数として取りうる全ての値に対して、関数を適用し結果が等しいか?を確認する必要があるから。これはとても面倒くさい。非現実的。
なので、適応結果が引数に依らない関数や、恒等関数idなら同等性の検証は実現可能。