O que faz este combinator fazer:s (s k)
-
12-12-2019 - |
Pergunta
Agora eu entendo o tipo de assinatura de s (s k)
:
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
E eu posso criar exemplos que funcionam sem erro os ficheiros de dados WinGHCi ferramenta:
Exemplo:
s (s k) (\g -> 2) (\x -> 3)
retorna 2
.
Exemplo:
s (s k) (\g -> g 3) successor
retorna 4
.
onde successor
é definido assim:
successor = (\x -> x + 1)
No entanto, eu ainda não tenho uma sensação intuitiva para que s (s k)
não.
O combinator s (s k)
leva quaisquer duas funções f
e g
.O que faz s (s k)
fazer com f
e g
?Você poderia me dar o big picture sobre o que s (s k)
faz por favor?
Solução
Tudo bem, vamos olhar para o que S (S K)
significa.Eu vou usar essas definições:
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)
Como você pode ver, é só ($)
com mais tipo específico.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow