できたらいいなAndroidアプリ

Androidに限らずいろいろ書いていく。

プログラミング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なら同等性の検証は実現可能。