首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在没有(显式)递归的情况下将Cons列表转换为Haskell列表?

如何在没有(显式)递归的情况下将Cons列表转换为Haskell列表?
EN

Stack Overflow用户
提问于 2018-04-21 04:53:42
回答 1查看 483关注 0票数 2

我有以下类型:data ConsList elem = Nil | Cons elem (ConsList elem)

如何将这种形式的列表转换为Haskell列表,并且转换不是递归的?

也就是说,我希望将(Cons 3 (Cons 5 (Cons 7 Nil)))转换为[3,5,7],或者如果您愿意,也可以转换为(3:(5:(7:[]))),并且实际上不使用递归函数。

我不认为使用fold是可以的,因为这个类型实际上并没有重载它,而且我不明白在没有显式递归的情况下如何重载fold。

EN

回答 1

Stack Overflow用户

发布于 2018-04-21 05:35:38

我发现简单数据结构的解决方案是简单地派生可折叠的。显然,即使对于这种结构,它似乎也不起作用,更不用说我真正需要的更复杂的结构了。

这里有一个函数unfoldr。其类型签名为:

代码语言:javascript
运行
复制
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]

本质上,它接受一个函数,该函数产生列表的下一个元素和剩余元素。

我们会这样称呼它:

代码语言:javascript
运行
复制
unfoldr unwrapElem l

unwrapElem本身的定义如下:

代码语言:javascript
运行
复制
unwrapElem :: (ConsList e) -> Maybe (e, ConsList e)
unwrapElem Nil = Nothing
unwrapElem (Cons el rem) = Just (el,rem)

需要注意的一件事是仍然存在递归,但是现在它是隐式的(在unfoldr本身内)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49949580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档