我有以下类型:data ConsList elem = Nil | Cons elem (ConsList elem)
如何将这种形式的列表转换为 Haskell 列表,并且转换不是递归的?
也就是说,我希望将 (Cons 3 (Cons 5 (Cons 7 Nil)))
转换为 [3,5,7]
或 (3:(5:(7:[])))
如果您愿意,并且无需实际使用递归函数。
我认为使用折叠是不行的,因为这种类型实际上并没有重载它,而且我不知道如何在没有实际显式递归的情况下重载折叠。
最佳答案
我发现简单数据结构的解决方案就是简单地派生 Foldable。显然,即使对于这种结构,它似乎也不起作用,更不用说我实际需要的更复杂的结构了。
有一个函数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
本身内)
关于haskell - 如何在不使用(显式)递归的情况下将 Cons 列表转换为 Haskell 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949580/