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)如何让它变得懒惰。
要创建函数流,您需要在递归调用之外使用 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
。
我是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)如何让它变得懒惰。
要创建函数流,您需要在递归调用之外使用 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
。