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?

Foi útil?

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
scroll top