Haskell Quizの解答編を書いた
Hacker's Cafe Blog: Haskell Quiz Answer
英語の練習がてら長々と書いているけど、ざっくりとまとめると
- Haskellでは値の定義のオーバーロードができる
- showとか定義したことあるよね
- 返り値の型でオーバーロードされた定義から選択することが可能(引数の型が同じで帰り値の方が違う関数をオーバーロードできる)
- しかも引数を取る必要もない
- 以前書いたHaskellで同じ名前が常に同じ値を返すとは限らないという話はほとんど答え。
- (+) や (==) は t -> t -> t なので x + (1::Int) は x を (x::Int) にする効果がある
- 0などの数値リテラルは (Num a) => a なので (0::Int) にも (0::Integer) にもなりうる
というわけでaやbはIntとして評価した場合とIntegerとして評価した場合で異なる値になる変数で、cがInt、dがIntegerで演算によって適当にaやbの型をコントロールしていたのでした。