Pergunta

Estou escrevendo uma função como esta.

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

Eu sei que está incorreto, mas a ideia é que eu quero o putStr aplicado na corda então print aplicado na mesma string "fun = .." para que a saída fosse:

func = putStr print "func = putStr print"

que é igual à minha definição de função.Obrigado

Foi útil?

Solução

Se o seu objetivo é escrever um quine (Outro exemplo de Haskell fornecido neste artigo também), você pode usar a notação lambda para captura de variáveis.

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

Outras dicas

Não tenho certeza de onde você está indo com o "sem usar >>"Parte (se esse é realmente o ponto de uso do-Notação), mas você pode escrever facilmente uma função auxiliar que aplica duas funções em sequência à mesma entrada:

tee f g s = f s >> g s

func = tee putStr print "..."

Além disso, para evitar repetir a corda, uma variável local com let ou where provavelmente seria o mais fácil:

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

Você poderia fazer assim:

doActions str actions = mapM_ ($ str) actions
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top