À quoi sert ce combinateur :s (sk)
-
12-12-2019 - |
Question
Je comprends maintenant la signature de type de s (s k)
:
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
Et je peux créer des exemples qui fonctionnent sans erreur dans l'outil Haskell WinGHCi :
Exemple:
s (s k) (\g -> 2) (\x -> 3)
Retour 2
.
Exemple:
s (s k) (\g -> g 3) successor
Retour 4
.
où successor
est défini ainsi :
successor = (\x -> x + 1)
Néanmoins, je n'ai toujours pas une sensation intuitive pour quoi s (s k)
fait.
Le combinateur s (s k)
prend deux fonctions quelconques f
et g
.Qu'est-ce que s (s k)
faire avec f
et g
?Veux-tu me donner la grande image sur quoi s (s k)
est-ce que s'il te plaît ?
La solution
Très bien, regardons quoi S (S K)
moyens.Je vais utiliser ces définitions :
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)
Comme vous pouvez le voir, c'est juste ($)
avec un type plus spécifique.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow