2010-03-29 6 views
1

Я пишу такую ​​функцию.Как применить две функции к одной строке без использования «>>»

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

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

func = putStr print "func = putStr print" 

который является тем же как определение моей функции. Благодаря

ответ

6

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

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

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

tee f g s = f s >> g s 

func = tee putStr print "..." 

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

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

Вы можете сделать это следующим образом:

doActions str actions = mapM_ ($ str) actions