我一直在思考如何实现以下类型的unfold
相当于的函数:
data Tree a = Node (Tree a) (Tree a) | Leaf a | Nil
由于列表的标准unfold
返回值和下一个种子不是立即显而易见的。对于这种数据类型,这没有意义,因为在达到叶节点之前没有“值”。因此,只有返回新种子或停止并返回值才是真正有意义的。我正在使用以下定义:
data Drive s a = Stop | Unit a | Branch s s deriving Show
unfold :: (t -> Drive t a) -> t -> Tree a
unfold fn x = case fn x of
Branch a b -> Node (unfold fn a) (unfold fn b)
Unit a -> Leaf a
Stop -> Nil
main = print $ unfold go 5 where
go 0 = Stop
go 1 = Unit 1
go n = Branch (n - 1) (n - 2)
虽然这似乎有效,但我不确定这是否是正确的方法。所以问题是:正确的做法是什么?