練習問題 4.1.3

空リストではないリストの最後の要素を返す関数
last
の定義として以下の2つを考えよ.


last  (x:xs) = if null xs  then x else last  xs
last' (x:xs) = if xs == [] then x else last' xs
last
last'
の違いは型が少し違うところである.


last  :: [a] -> a
last' :: (Eq a) => [a] -> a
last'
の定義には明示的に相等性検査が含まれているがゆえに,その型は相等性を持つ型から得られる要素のリストに限定される. 評価器が
last e
last' e
に対して異なる結果を応答するような式
e
の例を挙げよ.



たとえば,
e = (take 5 (iterate ((1+) .) id))
とする.


? let e = (take 5 (iterate ((1+) .) id))
? let f = last e
? f 0
4
? let f' = last' e

<interactive>:8:10:
    No instance for (Eq (Integer -> Integer))
      arising from a use of last'
    Possible fix:
      add an instance declaration for (Eq (Integer -> Integer))
    In the expression: last' e
    In an equation for f': f' = last' e
?