gpt4 book ai didi

haskell - 如何从函数内部打印变量?

转载 作者:行者123 更新时间:2023-12-04 16:42:38 24 4
gpt4 key购买 nike

所以我有一个主函数(foo),它递归地调用另外两个函数(step1 和 step2)。 foo 将 a1 添加到 a2 a count次数,然后返回(a1,a2)。如何在每一步打印变量计数、a1 和 a2?

-- adds a1 to a2 a `count` number of times
-- returns (a1, a2) once count reaches 0
foo :: Integer -> Integer -> Integer -> (Integer, Integer)
foo count a1 a2 | count == 0 = (a1,a2)
| otherwise = foo count' a1' a2'
where (count', a1', a2') = let (count'', a1'', a2'') = step1 count a1 a2
in step2 count'' a1'' a2''

-- adds a2 to a1. How to print out count, a1 and a2' here?
step1 :: Integer -> Integer -> Integer -> (Integer, Integer, Integer)
step1 count a1 a2 = (count, a1, a2')
where
a2' = a1 + a2

-- decrements count by 1. How to print out count', a1 and a2 here? Or can I do these prints somewhere in the `foo` function?
step2 :: Integer -> Integer -> Integer -> (Integer, Integer, Integer)
step2 count a1 a2 = (count', a1, a2)
where
count' = count - 1

这是来自更大代码库的代码的简化版本。我愿意使用不同的方法。我正在寻找的示例输出是:

$> 富 3 4 5

3 4 5

3 4 9

2 4 9

2 4 13

1 4 13

1 4 17

0 4 17

(4, 17)

编辑:我刚刚意识到我可以将中间结果存储在一个列表中,然后从该列表中打印。但是我认为我必须将列表作为参数传递给函数是否正确?

最佳答案

你必须改变 foo并使其在 IO 中运行单子(monad)。实际上,这会将函数“标记”为不纯的(即它具有副作用,例如在 stdout 上打印),这允许它调用诸如 print 之类的函数.这是一个例子:

foo :: Integer -> Integer -> Integer -> IO (Integer, Integer)
foo count a1 a2 = do
print (count, a1, a2)
case count of
0 -> do
print (a1,a2)
return (a1,a2)
_ -> do
let (count'', a1'', a2'') = step1 count a1 a2
(count', a1', a2') = step2 count'' a1'' a2''
foo count' a1' a2'

备注 : 如果你想打印这些值用于调试,那么你可以使用 Debug.Tracechepner's answer所示.您应该仅出于调试目的而不是出于其他原因这样做。

关于haskell - 如何从函数内部打印变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39756410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com