Comment appliquer deux fonctions sur la même chaîne sans utiliser « >> »
Question
Je suis en train d'écrire une fonction comme celui-ci.
func :: IO()
func = putStr print "func = putStr print"
Je sais qu'il est incorrect, mais l'idée est que je veux la putStr
appliquée sur la chaîne puis print
appliquée sur la même chaîne "fun = .."
de sorte que la sortie serait:
func = putStr print "func = putStr print"
qui est la même que ma définition de la fonction. Merci
La solution
Si votre objectif est d'écrire un Quine (Un autre exemple donné Haskell dans cet article aussi), vous pouvez utiliser la notation lambda pour la capture variable.
func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "
Autres conseils
Je ne sais pas où vous allez avec le « sans utiliser >>
» partie (si c'est vraiment l'utilisation du point do
notation), mais vous pouvez facilement écrire une fonction d'aide qui applique deux fonctions dans l'ordre à la même entrée :
tee f g s = f s >> g s
func = tee putStr print "..."
En outre, pour éviter que répéter la chaîne, une variable locale avec let
ou where
serait probablement le plus facile:
let s = "..."
in putStr s >> print s
Vous pouvez le faire comme ceci:
doActions str actions = mapM_ ($ str) actions