haskell - 如何在不使用(显式)递归的情况下将 Cons 列表转换为 Haskell 列表?

标签 haskell

我有以下类型: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/

相关文章:

list - 如何生成一个列表,其中包含 Haskell 范围内给定数量的随机数?

haskell - 无法将预期类型 `()' 与实际类型 `Int' 匹配

arrays - Haskell:我可以将整数直接读入数组吗?

Haskell 列表中最长的连续元素系列

haskell - 我怎样才能从值到类型?

python - 为什么 GHC 测试套件是用 Python 而不是 Haskell 编写的?

固定时间的 Haskell 分析

Haskell - 如何将最大值 (xs++ map (x+) xs) 转换为 max (最大 xs) (x + 最大 xs)

haskell - 将 `apply` 映射到函数列表

haskell - 当前关于记录全局命名空间的最佳实践