Hakell:'rememberMap' 不懒惰

Hakell: 'rememberMap' is non lazy

我是Haskell的新手,我写了下面的代码

module RememberMap (rememberMap) where

rememberMap :: (a -> b -> (a, c)) -> a -> [b] -> [c]
rememberMap f acc xs = go acc xs []
        where
          go acc [x] carry = carry <> [step]
            where
              (_, step) = f acc x
          go acc (x:xs) carry = go accStep xs (carry <> [step])
            where
              (accStep, step) = f acc x

我写这个污染器的目的是帮助我解决我在编写 Haskell 代码时遇到的最常见的困难,那就是我经常发现自己愿意映射一些东西(特别是在 CodeWarrior 的 Katas 中)喜欢映射一些东西,但那东西需要了解它之前的元素。但它有非流式的问题,因此,它不允许我使用 Haskell 的惰性属性,因此我想知道 (a) 是否已经有解决这个问题的方法 (最好是箭头)或(b)如何让它变得懒惰。

mapAccumL and traverse with the lazy State 个单子。

要创建函数流,您需要在递归调用之外使用 cons 运算符 ,这样调用者就可以看到第一个元素,而无需进行整个递归。所以你希望它看起来像:

rememberMap f acc (x:xs) = element : ... recursion ...

一旦你理解了这一点,就没有更多的事情要做了:

rememberMap _ _ [] = []
rememberMap f acc (x:xs) = y : rememberMap f acc' xs
  where
    (acc', y) = f acc x

如果你愿意,你可以创建一个辅助函数来避免传递 f,但是没有理由让它有你调用的额外列表 carry