展开返回累加器的最后一个状态

Pie*_*BdR 2 haskell pointfree unfold

unfoldHaskell中的函数非常便于创建列表.它的定义是:

unfold :: (b -> Maybe (a, b)) -> b -> [a]
Run Code Online (Sandbox Code Playgroud)

但我想得到累加器的最后一个值.可能的实现是:

unfoldRest :: (b -> Maybe (a, b)) -> b -> ([a], b)
unfoldRest fct ini = go fct ini []
  where
    go f s acc =
      case f s of
        Nothing -> (acc, s)
        Just (a, b) -> go f b (acc ++ [a])
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有办法用现有的功能来做.最后这个:

countDown 0 = Nothing
countDown n = Just (n, n-1)
unfoldRest countDown 10
Run Code Online (Sandbox Code Playgroud)

将返回:

([10,9,8,7,6,5,4,3,2,1],0)
Run Code Online (Sandbox Code Playgroud)

因为迭代在达到累加器值时停止0.

Tom*_*lis 8

import Data.List

unfoldr' :: (b -> Maybe (a, b)) -> b -> [(a, b)]
unfoldr' f = unfoldr (fmap (\(a, b) -> ((a, b), b)) . f)
Run Code Online (Sandbox Code Playgroud)

会给你累加器的所有状态.然后你可以选择看你想要的,包括最后一个.