2016-09-01 3 views
1

誰かがなぜこれらの2つの関数にこれらの型があるのか​​説明できますか?私は関数のパラメータでxの位置に対応するletの中で(gy)の位置のために、最初のものがxのような同じ型であることを最初のものが強制しなければならないと思うが、 2番目の関数では、そのように動作しません。これらのHaskell関数はなぜこれらの型を持っていますか?

f3 g x = let h y = f3 g (g y) in g x 
(t -> t) -> t -> t 
f4 g x = let h y = f4 g (g y) in x 
(t1 -> t) -> t -> t 

答えて

3

f3は2つの引数の関数であるため、タイプはt2 -> t1 -> tです。関数の結果はg xなので、タイプはtです。 g自体はのxという1つの引数の関数でなければならないので、gのタイプはt2 = t1 -> tです。 h yの未使用定義では、結果タイプを引数タイプとして受け入れるにはgが必要で、t1 = tになります。これにより、(t -> t) -> t -> tになります。

f4は再び2つの引数の関数であるため、タイプはt3 -> t2 -> tです。 xを返すだけなので、t2tに等しくなければなりません。 h y の定義は、t2別名tであることを制約しますが、yの型に制約はありません。t1を呼び出すことができます。これは、タイプgとしてt1 -> tにつながります。等式を代入すると(t1 -> t) -> t -> tとなります。

2
f3 g x = let h y = f3 g (g y) in g x 

のは、最初の簡単なバージョンを見てみましょう:

ここ
f3' g x = g x 

gxに適用され、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 

を取得します。

関連する問題