私の質問に答えてくれたすべての人に感謝します。私はあなたの反応を研究しました。私が学んだことを確実に理解するために、私は自分の質問に対する自分自身の答えを書きました。私の答えが正しくない場合は、私に知らせてください。
k
とのタイプから始めますs
:
k :: t1 -> t2 -> t1
k = (\a x -> a)
s :: (t3 -> t4 -> t5) -> (t3 -> t4) -> t3 -> t5
s = (\f g x -> f x (g x))
まず、の型アノテーションの決定に取り組みましょう(s k)
。
s
の定義を思い出してください。
s = (\f g x -> f x (g x))
結果を代用k
すると、次の契約が成立します。f
(\f g x -> f x (g x))
(\g x -> k x (g x))
重要k
gとxの型は、の型署名と一致している必要があります。
k
この型署名があることを思い出してください。
k :: t1 -> t2 -> t1
したがって、この関数定義k x (g x)
については、次のように推測できます。
のタイプx
は、k
の最初の引数のタイプであり、タイプt1
です。
k
の2番目の引数の型は。t2
であるため、の結果は。で(g x)
なければなりませんt2
。
g
x
すでに決定した引数として、タイプがありますt1
。したがって、の型アノテーションは(g x)
です(t1 -> t2)
。
k
の結果のタイプはt1
、であるため、の結果は(s k)
ですt1
。
したがって、の型アノテーション(\g x -> k x (g x))
は次のとおりです。
(t1 -> t2) -> t1 -> t1
次に、k
常に最初の引数を返すように定義されています。したがって、この:
k x (g x)
これとの契約:
x
この:
(\g x -> k x (g x))
これとの契約:
(\g x -> x)
さて、今私たちは理解しました(s k)
:
s k :: (t1 -> t2) -> t1 -> t1
s k = (\g x -> x)
次に、の型アノテーションを決定しましょうs (s k)
。
同じように進めます。
s
の定義を思い出してください。
s = (\f g x -> f x (g x))
結果を代用(s k)
すると、次の契約が成立します。f
(\f g x -> f x (g x))
(\g x -> (s k) x (g x))
重要g
およびの型は、の型署名x
と一致している必要があります。(s k)
(s k)
この型署名があることを思い出してください。
s k :: (t1 -> t2) -> t1 -> t1
したがって、この関数定義(s k) x (g x)
については、次のように推測できます。
のタイプx
は、(s k)
の最初の引数のタイプであり、タイプ(t1 -> t2)
です。
(s k)
の2番目の引数の型は。t1
であるため、の結果は。で(g x)
なければなりませんt1
。
g
引数としてhasx
がありますが、これはすでにタイプがであると判断してい(t1 -> t2)
ます。したがって、の型アノテーションは(g x)
です((t1 -> t2) -> t1)
。
(s k)
の結果のタイプはt1
、であるため、の結果はs (s k)
ですt1
。
したがって、の型アノテーション(\g x -> (s k) x (g x))
は次のとおりです。
((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
s k
以前、この定義があると判断しました。
(\g x -> x)
つまり、2つの引数を取り、2番目の引数を返す関数です。
したがって、これは:
(s k) x (g x)
これに対する契約:
(g x)
この:
(\g x -> (s k) x (g x))
これとの契約:
(\g x -> g x)
さて、今私たちは理解しましたs (s k)
。
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
s (s k) = (\g x -> g x)
最後に、s (s k)
の型シグネチャをこの関数の型シグネチャと比較します。
p = (\g x -> g x)
タイプp
は次のとおりです。
p :: (t1 -> t) -> t1 -> t
p
s (s k)
同じ定義を持っ(\g x -> g x)
ているのに、なぜそれらは異なる型シグネチャを持っているのですか?
s (s k)
型シグネチャがとは異なる理由p
は、に制約がないためp
です。s
inは、(s k)
の型シグネチャと一致するように制約されk
ており、最初のs
ins (s k)
は、の型シグネチャと一致するように制約されていることがわかりました(s k)
。したがって、の型アノテーションはs (s k)
その引数のために制約されます。p
とは同じ定義を持っていますが、とs (s k)
の制約は異なります。g
x