我有以下类型:data ConsList elem = Nil | Cons elem (ConsList elem)
如何将此表单的列表转换为Haskell列表,转换不是递归的?
也就是说,如果您愿意,我希望(Cons 3 (Cons 5 (Cons 7 Nil)))
转换为[3,5,7]
或转换为(3:(5:(7:[])))
,而不是实际使用递归函数。
我不认为使用折叠是可以的,因为这种类型实际上没有超载它我不知道如何在没有实际递归的情况下重载折叠。
答案 0 :(得分:3)
我发现简单数据结构的解决方案是简单地派生出可折叠的。显然,即使这个结构看起来似乎也不起作用,更不用说实际需要的那个更复杂的了。
有一个函数unfoldr
。它的类型签名是:
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
本质上,它需要一个函数来生成列表的下一个元素和余数。
我们称之为:
unfoldr unwrapElem l
和unwrapElem
本身的定义如下:
unwrapElem :: (ConsList e) -> Maybe (e, ConsList e)
unwrapElem Nil = Nothing
unwrapElem (Cons el rem) = Just (el,rem)
有一点需要注意的是,仍然存在递归,但它现在是隐式的(在unfoldr
本身内)