とか、など

プログラミングとか、画像処理とか、機械学習を勉強しようとして挫折中

プログラミングHaskell1-3章を読破

プログラミングHaskellを勉強中


3章の練習問題をやってみる(関数の:typeを調べるときは,先にlet で定義してやるべし)
注に書いてあるように,double, とかpalindromeとかはクラス制約がきちんと書かれている

--1.の答え
Prelude> :type ['a', 'b', 'c']
['a', 'b', 'c'] :: [Char]

Prelude>  :type ('a', 'b', 'c')
('a', 'b', 'c') :: (Char, Char, Char)

Prelude>  :type [(False, '0'), (True, '1')]
[(False, '0'), (True, '1')] :: [(Bool, Char)]

Prelude> :type ([False, True], ['0', '1'])
([False, True], ['0', '1']) :: ([Bool], [Char])

Prelude> :type [tail, init, reverse]
[tail, init, reverse] :: [[a] -> [a]]
--2.の答え
Prelude> let second xs = head (tail xs)
Prelude> :type second
second :: [a] -> a

Prelude> let swap (x, y) = (y, x)
Prelude> :type swap
swap :: (t1, t) -> (t, t1)

Prelude> let pair x y = (x, y)
Prelude> :type pair
pair :: t -> t1 -> (t, t1)

Prelude> let double x = x * 2
Prelude> :type double
double :: Num a => a -> a

Prelude> let palindrome xs = reverse xs == xs
Prelude> :type palindrome
palindrome :: Eq a => [a] -> Bool

Prelude> let twice f x = f (f x)
Prelude> :type twice
twice :: (t -> t) -> t -> t

3.は上のコード実行
4.はちょっとよくわからない.関数が全く同じものであることを示すには
すべての入力に対してすべての出力が同じにならなければいけないということ?
その場合内部のアルゴリズムの違いは気にしないでもよいのか?(クイックソートバブルソートみたいな感じで)
なんにせよ,入力の範囲が有限でなければ一般に同一であることを確かめられないから無理そう.
入出力の対応を数学的に証明できる場合は同等といえるか...