Вопрос

Теперь я понимаю сигнатуру типа 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.Что значит s (s k) делать с f и g?Ты бы дал мне большая картина На что s (s k) пожалуйста?

Это было полезно?

Решение

Хорошо, давайте посмотрим, что 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)

Как видите, это просто ($) с более конкретным типом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top