Что делает этот комбинатор:с (с к)
-
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
.Что значит 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)
Как видите, это просто ($)
с более конкретным типом.
Не связан с StackOverflow