すごいH本7

土井のモノイド!w

感想
・data、instance、typeときて今度はnewtypeキーワード。いよいよ混乱してきたから整理。

data 型コンストラクタ 型引数 = 値コンストラクタ1 フィールド | ...
                             値コンストラクタ2 { <u>フィールド名</u> :: フィールド
                                              , ... } | ...
newtype 型コンストラクタ 型引数 = 値コンストラクタ フィールド
instance 型制約 型コンストラクタ where ...

とすると、

-- 種類
型コンストラクタ :: * -> ... -> *
型コンストラクタ 型変数 :: * -- 具体型
型制約 :: (型コンストラクタの種類) -> Constraint
-- 型
値コンストラクタ :: フィールド -> 具体型
フィールド名 :: 具体型 -> フィールド

たぶんこんな感じ?
・「コンストラクタに包んだり」って意味がよくわからなかった。newtypeは型引数も値コンストラクタもフィールドも1つのみって確定してることと比較して考えたら、dataで宣言した型は内部の値コンストラクタが自明でないっていうことかな。
・undefinedの型がaで、型制約が一切ない!!ってなんでか知らないけどちょっと興奮した。
・foldMapとfoldrやfoldlの関係がいまいちつかめてない。Treeについて書かれてた例について対応を考えてみた。

F.foldr (\x acc -> [x] `mappend` acc) mempty testTree
-- F.foldMap (\x -> [x]) testTree
F.foldMap (\x -> x) testTree
-- F.foldl (+) 0 testTreeのつもり。動かなかった。

foldMapで書かれたものをfoldrやfoldlにするのはできそうに感じたけど、逆は難しいのかな。2番目のやつはF.foldl (*) 1 testTreeのつもりとも言えるし、mappendが何になるかを与える方法がわからない。

少しプログラミングHaskellを読む機会があったので4章まで読んだ。復習みたいな感じだったので楽かと思ったけど本が違うと違うとこで詰まった。また、何人かで読んだのでいろいろ発見があっておもしろかった。
・1`div`0は零除算で例外がでたけど1/0はInfinityと表示された(1/0の型はFractional a => aだった)。しかし別にInfinityという値が定義されてるわけではないらしい。
[追記12/30]-1/0は-Infinity、1/0 - 1/0や1/0 * 0はNaNになり、型はFractional a => aだった。
・要素が1つだけのタプル型はその要素そのものと区別がつかないっぽい?

:t (1)
-- (1) :: Num p => p
(1) + 1
-- 2

・分数のまま計算するにはData.Ratioをimportして、%をつかう。

sum $ take 10 $ repeat (1/10)
-- 0.9999999999999999
sum $ take 10 $ repeat (1%10)
-- 1 % 1 :: Integral a => Ratio a
fromRational $ sum $ take 10 $ repeat (1/10)
-- 1.0

RationalはRatio Integerの型シノニムらしい。
・「関数の型をEqクラスのインスタンスにするのが実現不可能な理由」「どういった場合に実現可能か」という問題で、型が一致する関数を等しいと定義すれば関数間の等式を考えられるんじゃないか?と思ったらData.TypeableをimportしたらtypeOfで型を見れるらしい。その時すごい興奮したけど、今考えると比較するのは同じ型どうしなのでこの問題の解答にはならないね…