すごいH本2

5章まで読んだ。すでにペースが落ちてる。

読んでてへぇとなったとことか疑問に思ったとこのメモ
・GHCiでは結果をshowで文字列にしてるから型がShowのインスタンス(?)でないものは表示できない。
・Num aならEq aも自動的に成り立ってると思ったけど違うのかな。ちゃんと指定しないとエラーになった。
(追記8/31)7章読んでるけどNumはEqのサブクラスって書いてるし

list103 :: (Num a, Eq a) => [(a, a)] -> [a]
list103 [] = []
--list103 ((x1, x2):xs)
--    | (x2 == 3) = (100 * x1 + 3):(list103 xs)
--    | otherwise = list103 xs
list103 ((x1, 3):xs) = (100 * x1 + 3):(list103 xs)
list103 (_:xs) = list103 xs

で型宣言のEq aを消したらだめなの本当によくわからんな…

map (`div` 2) (filter even [1..10])

としたらうまくいったのに

map (/ 2) (filter even [1..10])

は動かなくてかなり混乱した。

even :: (Integral a) => a -> Bool
div :: (Integral a) => a -> a
(/) :: (Fractional a) => a -> a 

だからだめらしい。
fromIntegralを用いたらできたけど、最初これを知らなくて、自分でキャストしようと適当に

-- コンパイルエラーした
fromIntegral' :: (Integral a, Num b) => a -> b
fromIntegral' x = x

みたいにしたらどうなるかなと思ったけどだめだった。
・foldでめちゃくちゃ混乱した。まず、

foldl :: (a -> b -> a) -> a -> [b] -> a
foldr :: (a -> b -> b) -> b -> [a] -> b

(GHCiで:tしたら[a]じゃなくて(Foldable t) => t aみたいだったけど、ここは本に合わせて)
で、適用する関数の引数の順番がどっちがアキュムレータでどっちがリストの要素かわからなかった。
あと、

foldl f a [b] = f (f ... f (a b1) b2) ... bn) 
foldr f b [a] = f a1 (f a2 ... (f an b) ... )

のように見なしたときに、適用順序評価(?)では確かに木の深さ的にfoldlは左から、foldrは右からリストを走査してるかな…って思ったけど、そのあとの無限リストの取り扱いを見るに正規順序評価っぽく見えたので、それならむしろfoldrのほうが左から評価してるように感じてごちゃごちゃになった。うまいこと整理したいな…
・関数適用演算子の、ある数を関数に適用する関数にする、みたいな使い方はおもしろかった。テンパズルとかに使えるかなと妄想した(妄想しただけで作れてない)。256個の演算方法をべた書きするのかな…
・関数合成の項といい、Haskellでは括弧を避ける風習があるのかな。前から読んでいくスタイルなら確かに無いほうがいいか。

5章異常に重い…これを乗り越えたら…と思ってたけど目次見たらこの後はそんな感じのページ数の章だらけで眩暈が…