作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我想开发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/
我是一名优秀的程序员,十分优秀!