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.
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)
会给你累加器的所有状态.然后你可以选择看你想要的,包括最后一个.