メモ

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)に束縛(?)、限定(?)されちゃっているわけですが、現象という程では無いんでしょうけど、これこういうのは名前が付いてるもんなのかなーとかいう。