Как применить две функции к одной строке, не используя ">>" - PullRequest
1 голос
/ 29 марта 2010

Я пишу такую ​​функцию.

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

Я знаю, что это неправильно, но идея в том, что я хочу, чтобы putStr применялось к строке, а print применялось к той же строке "fun = ..", чтобы вывод был:

func = putStr print "func = putStr print"

, что совпадает с моим определением функции. Спасибо

Ответы [ 3 ]

6 голосов
/ 29 марта 2010

Если ваша цель - написать quine (еще один пример с Haskell, приведенный в этой статье), вы можете использовать лямбда-нотацию для захвата переменных.

func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "
2 голосов
/ 29 марта 2010

Вы можете сделать это так:

doActions str actions = mapM_ ($ str) actions
2 голосов
/ 29 марта 2010

Я не уверен, куда вы идете с частью "без использования >>" (если это действительно точка, используйте примечание do), но вы можете легко написать вспомогательную функцию, которая применяет две функции последовательно на тот же вход:

tee f g s = f s >> g s

func = tee putStr print "..."

Кроме того, чтобы просто не повторять строку, локальная переменная с let или where, вероятно, будет самой простой:

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