Что делает этот комбинатор: s (s k)
Теперь я понимаю тип подписи 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)
пожалуйста?
1 ответ
Решение
Хорошо, давайте посмотрим на что 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)
Как видите, это просто ($)
с более конкретным типом.