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

StackOverflow https://stackoverflow.com/questions/2540324

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top