Monad Ambiguous type variable
例は IFPH 10章より。
data Term = Con Int | Div Term Term evalId (Con x) = return x evalId (Div t u) = do x <- evalId t y <- evalId u return (x `div` y)
上記は意図的に evalId の型を指定していない。型を調べると、
:t evalId evalId :: Monad m => Term -> m Int
と推論されていて、具体的なモナド(例えば Identity モナド) を指定しないと動かないように思える。実際、別の変数に束縛しようとするとエラーになる。にもかかわらず、ghci で実行すると実行できてしまう。
:t evalId (Con 13) => evalId (Con 13) :: Monad m => m Int let x = evalId (Con 0) => Ambiguous type variable m0 in the constraint: (Monad m0) arising from a use of evalId evalId (Con 13) => 13
これはいったい何が起きているのだろう?