gpt4 book ai didi

haskell - 如何在 foldl 函数 Haskell 中记录操作?

转载 作者:行者123 更新时间:2023-12-02 15:27:20 25 4
gpt4 key购买 nike

例如,我想开发sum函数,它会显示中间结果。

我的基本功能是:

ownPlus start list = foldr (+) start list

我想在 foldl 中添加 Writer Monad。所以我的函数原型(prototype)是:

sumWithLogging :: (Show a, Num a) => a -> [a] -> Writer String a
sumWithLogging start list = foldr ((+) do tell ["msg"]) start list

我在编写这个函数时遇到了问题。但我希望我的结果看起来像这样:

*Main> runWriter $ sumWithLogging 0 [1..2]
(3,"(1+(2+0))")

最佳答案

scanl 可能是一个有用的函数。

来自 Hoogle:

scanl is similar to foldl, but returns a list of successive reduced values from the left.

所以,你可以看到渐进的结果是这样的:

λ> scanl (+) 0 [1,2,3]
[0,1,3,6]
λ> scanl (flip (:)) [] [1,2,3,4,5]
[[],[1],[2,1],[3,2,1],[4,3,2,1],[5,4,3,2,1]]

如果您想要像作家一样的结果,很简单。您甚至不需要使用 Writer,避免使用过于复杂的功能总是好的。

logSum = foldl (\(n,s) x -> (n+x, "(" ++ s ++ "+" ++ show x ++ ")")) (0,"0")

λ> logSum [1..2]
(3, "((0+1)+2)")

我可能会补充说,foldl 应该描述左结合操作,但是方括号在您编写它们的方式中暗示了右结合 .

如果你想让它是右结合的(像 (:) 运算符),这很容易;使用 foldr:

 logSumR = foldr (\x (n,s) -> (x:n, show x ++ " : " ++ s)) ([],"[]")

这样:

λ logSumR [1,2,3,4,5]
([1,2,3,4,5], "1 : 2 : 3 : 4 : 5 : []")

关于haskell - 如何在 foldl 函数 Haskell 中记录操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704879/

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