如何在不使用“>>”的情况下将两个函数应用于同一个字符串

时间:2010-03-29 18:29:32

标签: haskell monads

我正在编写这样的函数。

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

我知道这是不正确的,但我的想法是我希望putStr应用到字符串然后print应用到相同的字符串"fun = ..",以便输出为:

func = putStr print "func = putStr print"

与我的函数定义相同。感谢

3 个答案:

答案 0 :(得分:6)

如果您的目标是编写quine(本文中给出的另一个Haskell示例),则可以使用lambda表示法进行变量捕获。

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

答案 1 :(得分:2)

我不确定你在哪里使用“不使用>>”部分(如果那真的是使用do - 符号),但你可以轻松编写一个适用的辅助函数两个函数按顺序输入到同一个输入:

tee f g s = f s >> g s

func = tee putStr print "..."

另外,为了避免重复字符串,使用letwhere的局部变量可能是最简单的:

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

答案 2 :(得分:2)

你可以这样做:

doActions str actions = mapM_ ($ str) actions