このコンビネータは何をしますか:S(S k)
-
12-12-2019 - |
質問
s (s k)
のタイプシグネチャを理解する:
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
.
と私はHaskell Winghciツールでエラーなしで機能する例を作成できます:
.
s (s k) (\g -> 2) (\x -> 3)
2
を返します。
.
s (s k) (\g -> g 3) successor
4
を返します。
successor
がそのように定義されている場合:
successor = (\x -> x + 1)
.
それでもなお、私はまだs (s k)
を行うのはが直感的な感触を持っていません。
コンビネータs (s k)
は、f
とg
を2つの関数に取ります。s (s k)
とf
を使用して何がありますか?g
をどうぞ。
解決
大丈夫、S (S K)
を意味するものを見てみましょう。私はこれらの定義を使うつもりです:
S = \x y z -> x z (y z)
K = \x y -> x
S (S K) = (\x y z -> x z (y z)) ((\x y z -> x z (y z)) (\a b -> a)) -- rename bound variables in K
= (\x y z -> x z (y z)) (\y z -> (\a b -> a) z (y z)) -- apply S to K
= (\x y z -> x z (y z)) (\y z -> (\b -> z) (y z)) -- apply K to z
= (\x y z -> x z (y z)) (\y z -> z) -- apply (\_ -> z) to (y z)
= (\x y z -> x z (y z)) (\a b -> b) -- rename bound variables
= (\y z -> (\a b -> b) z (y z)) -- apply S to (\a b -> b)
= (\y z -> (\b -> b) (y z)) -- apply (\a b -> b) to z
= (\y z -> y z) -- apply id to (y z)
.
わかるように、それはより具体的なタイプの($)
です。
所属していません StackOverflow