6

私は今、次の型署名を理解していますs (s k)

s (s k)  :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1

そして、HaskellWinGHCiツールでエラーなしで機能する例を作成できます。

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)は、任意の2つの関数fとを取りますg。とは何s (s k)fgますか?何をお願いするかについての全体像を教えていただけますs (s k)か?

4

1 に答える 1

11

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)

ご覧のとおり($)、より具体的なタイプです。

于 2012-03-12T10:08:01.600 に答える