f3 g x = let h y = f3 g (g y) in g x
のは、最初の簡単なバージョンを見てみましょう:
ここ
f3' g x = g x
g
x
に適用され、g
の結果はf3'
の結果となっています。したがって、f3'
のタイプは(a -> b) -> a -> b
です。
フルf3
は、いくつかの追加の制約を紹介する部分式f3 g (g y)
が、含まれています。通過(あなたがあなたの質問に言ったように)(なし追加の制約g
は、我々が最初に使って呼び出された引数であるため)f3 g
は無害ですが、 g y
は、g
の結果がx
(第2パラメータ)と同じ型でなければならないことを意味します。
これはa = b
を意味し、したがってを意味します。 2番目の例では
我々はlet
なければ
f4 g x = let h y = f4 g (g y) in x
を持っている、それだけです:タイプa -> b -> b
を持って
f4' g x = x
。
フルf4
には、f4 g (g y)
が含まれています。
f4 :: a -> b -> b
g :: a
x :: b
g :: c -> d
a = c -> d
その後(g y)
は、そのことを意味f4
の2番目の引数として使用されます。一つには、これは(それがy
に適用されているため)g
、制約の私達のセットは次のようになりますので、機能であることを有することを意味しますタイプはb
に等しくなければならない:y
またはf4
上に配置された追加の制約がないので、
g y :: b
g :: c -> b
y :: c
d = b
h
は使用されません。 f4
の種類の変数を代入すると、我々は((t1 -> t) -> t -> t
モジュロ命名に相当する)
f4 :: (c -> b) -> b -> b
を取得します。