Domanda

Sto scrivendo una funzione come questa.

func :: IO()
func = putStr print "func = putStr print"

Lo so che non è corretta ma l'idea è che voglio il putStr applicato sulla stringa poi print applicato sulla stessa "fun = .." stringa in modo che l'output potrebbe essere:

func = putStr print "func = putStr print"

che è lo stesso che la mia definizione di funzione. Grazie

È stato utile?

Soluzione

Se il vostro obiettivo è quello di scrivere un Quine (Un altro esempio dato Haskell in questo articolo anche), è possibile utilizzare la notazione lambda per la cattura variabile.

func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "

Altri suggerimenti

Non sono sicuro di dove si sta andando con la parte "senza utilizzare >>" (se questo è davvero il do notazione utilizzo punto), ma si può facilmente scrivere una funzione di supporto che si applica due funzioni in sequenza allo stesso ingresso :

tee f g s = f s >> g s

func = tee putStr print "..."

Inoltre, per evitare di ripetere solo la stringa, una variabile locale con let o where sarebbe probabilmente la più semplice:

let s = "..."
in  putStr s >> print s

Si potrebbe fare in questo modo:

doActions str actions = mapM_ ($ str) actions
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top