1

我正在编写这样的函数。

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

我知道这是不正确的,但我的想法是我希望putStr应用到字符串上,然后print应用到同一个字符串上"fun = ..",这样输出将是:

func = putStr print "func = putStr print"

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

4

3 回答 3

6

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

func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "
于 2010-03-29T18:57:54.207 回答
2

我不确定您将使用“不使用>>”部分(如果这确实是使用do-notation 的重点),但您可以轻松编写一个辅助函数,将两个函数依次应用于同一输入:

tee f g s = f s >> g s

func = tee putStr print "..."

此外,为了避免重复字符串,带有letor的局部变量where可能是最简单的:

let s = "..."
in  putStr s >> print s
于 2010-03-29T18:52:59.583 回答
2

你可以这样做:

doActions str actions = mapM_ ($ str) actions
于 2010-03-29T19:01:19.113 回答