Как применить две функции к одной и той же строке без использования «>>»
Вопрос
Я пишу такую функцию.
func :: IO()
func = putStr print "func = putStr print"
Я знаю, что это неправильно, но идея в том, что я хочу putStr
наносится на строку, затем print
применяется к той же строке "fun = .."
чтобы результат был:
func = putStr print "func = putStr print"
что совпадает с моим определением функции.Спасибо
Решение
Если ваша цель — написать куайн (Еще один пример Haskell, приведенный в этой статье), вы можете использовать лямбда-нотацию для захвата переменных.
func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "
Другие советы
Я не уверен, к чему вы идете с «без использования >>
" часть (если это действительно важно, используйте do
-notation), но вы можете легко написать вспомогательную функцию, которая последовательно применяет две функции к одному и тому же вводу:
tee f g s = f s >> g s
func = tee putStr print "..."
Кроме того, чтобы избежать повторения строки, локальная переменная с let
или where
вероятно, будет самым простым:
let s = "..."
in putStr s >> print s
Вы можете сделать это следующим образом:
doActions str actions = mapM_ ($ str) actions