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