メモ
f1 :: Int-> (Int -> Int) f1 0 = id f1 1 = (\x -> x + 1) :t f1 0 -> f1 0 :: Int -> Int f2 :: Int -> (a -> a) f2 0 = id f2 1 = (\x -> x + 1) f2の定義にはこける
f2の返値が(a -> a)というなんの束縛も無い筈なのに、(f2 1)の引数であるxには操作として"+"が出来る事が必要になるのでまぁ・・・。
実際、f2にexplicit type signatureしないで推論させると、多分f2 :: (Num a) => Int -> (a -> a)とか出ていけるんでしょうけど、別にそういう事がさせたいわけじゃなくて云々。
あくまでも、"forall a"なので、どんな型であっても正しく無いといけない以上、"+"がある事を要求される様な関数定義でははじかれて当然であると。
ただ、f1の時は、元々は(forall a. a -> a)の型を持っていたidが、(Int -> Int)に束縛(?)、限定(?)されちゃっているわけですが、現象という程では無いんでしょうけど、これこういうのは名前が付いてるもんなのかなーとかいう。