Quiz

なんか見かけたので考えてみた.
http://blog.hackers-cafe.net/2010/06/haskell-quiz.html

想定解っぽいもの

(+), (!!), (==), sum, print に関しては didn't define と明言されているのに ($) はされてないからまぁこれを自分で定義しろということなんだろう.
http://ideone.com/lD5J2


これだけだとつまらないので別解も考えた.

さすがにダメだなと思うもの

True, True, True, True, True, True, True, True, 1, 1, 0, 1, 0 と表示するコードにしろ,という話ならプリプロセッサで既存の main をどかして自分で改めて書いた main にすればいいんじゃないかと思った.
さすがにアウトだろう.

もうちょっと考えて出したもの

(==) を定義しなくても (/=) を定義すればその型について (==) が使える.
また,GeneralizedNewtypeDeriving という拡張を用いると newtype で定義した型について通常よりも多くのクラスを deriving することができ,具体的には Num も可能になる.
というわけでこんなものを書いた.
http://ideone.com/z4i9j
deriving することで (+) を定義しないという制約を守っているつもり.
ただし (!!) が厄介で,こいつのせいで a, b, c が Int 型でないといけない.
仕方なく unsafeCoerce するも,今度は a == c や [a,b,c] の型が定まらなくなり型注釈を加えてしまった.ルール違反か.
しかも元の文をよく読んでみると「All of them are original, came from the prelude module.」とあった.ひー.