関数型プログラミングの講義中に、次の Haskell 関数を見ました。
f :: Bool -> Int -> (a -> Int) -> Int
f x y z = if x then y + y else (z x) + (z y)
この関数は型チェックに失敗することが予想されます。しかし、これが起こる理由は説明されていませんでした。GHCIで試してみると、次の出力が得られました。
Prelude> :l test [1 of 1] Main のコンパイル ( test.hs, 解釈された) test.hs:2:35: 予想される型「a」を実際の型「Bool」と一致させることができませんでした 「a」は、によって束縛される固定型変数です。 f :: Bool -> Int -> (a -> Int) -> Int の型シグネチャ test.hs:1:6 で 関連するバインディングには次のものがあります。 z :: a -> Int (test.hs:2:7 でバインド) f :: Bool -> Int -> (a -> Int) -> Int (test.hs:2:1 でバインド) `z' の最初の引数、つまり `x' `(+)' の最初の引数、つまり `(zx)' で失敗しました。ロードされたモジュール: なし。
なぜこれが起こるのですか?