プログラミングHaskell (第三章の練習問題)
まだまだ、調子よく進んでますが...
3.11 (1) 以下の値の型は何か?
a :: [Char]
a = ['a','b','c']
b :: (Char,Char,Char)
b = ('a','b','c')
c :: [(Bool,Char)]
c = [(False,'o'),(True,'l')]
d :: ([Bool],[Char])
d = ([False,True],['o','l'])
e :: [([a]->[a])]
e = [tail,init,reverse]最後の問題は、括弧はつけなくとも大丈夫だとは思いましたがあえて関数のリストということであえてつけてみましたが冗長なのでむしろわかりにくくなるかもしれないので減点。
3.11 (2) 以下の関数の型は何か?
second'::[a] -> a
second' xs = head(tail xs)
swap'::(x,y) -> (y,x)
swap' (x,y) = (y,x)
pair':: x -> y -> (x,y)
pair' x y = (x,y)
double'::Num x => x -> x
double' x = x * 2
palindrome'::Eq a => [a] -> Bool
palindrome' xs = reverse xs == xs
twice'::(a -> a) -> a -> a
twice' f x = f (f x)頭の中だけでやってるとdouble'やpalindrome'はひっかかります。次のHugsを使って確かめよとヒントでなんとかクリア。
3.11 (3) Hugsを使って確かめよ(ghc v6.10.4で検証)
*Main> second' [1,2,3]
2
*Main> :t second'
second' :: [a] -> a
*Main> swap' (1,2)
(2,1)
*Main> :t swap'
swap' :: (x, y) -> (y, x)
*Main> pair' 'x' 'y'
('x','y')
*Main> :t pair'
pair' :: x -> y -> (x, y)
*Main> double' 3
6
*Main> :t double'
double' :: (Num x) => x -> x
*Main> palindrome' [1,2,3,2,1]
True
*Main> :t palindrome'
palindrome' :: (Eq a) => [a] -> Bool
*Main> twice' (^2) 2
16
*Main> :t twice'
twice' :: (a -> a) -> a -> a
*Main> これは特に問題なし。
3.11 (4) 一般的に関数の型をEqクラスのインスタンスにするのが実現不可能な理由は何か?
関数が等しいということが同じ型の二つの関数が等しいのは、同等な引数に対して同等な結果を返すとき
とすると、実行するまで同等か否かを評価できないためEqクラスのインスタンスとすることはでいない。例えば、引数をそのまま返すだけの関数同士はEqクラスのインスタンスとして実現可能かもしれない
というのが僕の苦しい解答。これは初のギブアップ問題に近いですね。模範解答は
In general, checking if two functions are equal requires enumerating all possible argument values, and checking if the functions give the same result for each of these values. For functions with a very large (or infinite) number of argument values, such as values of type Int or Integer, this is not feasible. However, for small numbers of argument values, such as values of type of type Bool, it is feasible.
ある意味拍子抜けするような解答ですが、無限リストの引数、型(Int/Integer)の違いに思い至らなかった点で減点。
また、実行時にしか評価できない云々は考えすぎ?最後の、for small numbers of argument values, such as values of type of type Bool, it is feasible
にもあるとおり、引数がBoolとかの単純なものだったら可能であると言っているので、あくまでも"引数が同じかどうかを評価するのが大変すぎるぜ!"というのが理由であるのでこれも減点です。一応、副作用がどうのとかも考えてみましたが第三章までにはそういうことはでてきていないのでそれも関係ないですね。こういう問題を出されるとすぐに馬脚を現します。
| 添付 | サイズ |
|---|---|
| ex3.hs | 944 bytes |









Comments