Comment appliquer deux fonctions sur la même chaîne sans utiliser « >> »

StackOverflow https://stackoverflow.com/questions/2540324

  •  23-09-2019
  •  | 
  •  

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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top