我有以下类型:data ConsList elem = Nil | Cons elem (ConsList elem)
如何将这种形式的列表转换为Haskell列表,并且转换不是递归的?
也就是说,我希望将(Cons 3 (Cons 5 (Cons 7 Nil)))
转换为[3,5,7]
,或者如果您愿意,也可以转换为(3:(5:(7:[])))
,并且实际上不使用递归函数。
我不认为使用fold是可以的,因为这个类型实际上并没有重载它,而且我不明白在没有显式递归的情况下如何重载fold。
发布于 2018-04-21 05:35:38
我发现简单数据结构的解决方案是简单地派生可折叠的。显然,即使对于这种结构,它似乎也不起作用,更不用说我真正需要的更复杂的结构了。
这里有一个函数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
本身内)。
https://stackoverflow.com/questions/49949580
复制相似问题