You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Haskell中借助Foldable容器与Functor实现toList函数

实现思路与代码

核心逻辑

你不需要自行实现列表的Foldable实例,给出的instance Foldable [] where fold = undefined只是习题给出的占位示例,标准库中已经有成熟的列表Foldable实现可以直接使用。
要结合Functor和Foldable实现toList,只需要两步操作:

  • 利用Functor的fmap能力,把原容器中每个元素都包装成单元素列表,得到类型为c [a]的新容器
  • 利用Foldable的fold能力,把容器中所有单元素列表通过列表的Monoid拼接规则合并,最终得到完整的元素列表

完整实现

toList :: (Functor c, Foldable c) => c a -> [a]
toList = fold . fmap (:[])

你也可以写成非点式的写法,逻辑完全一致:

toList :: (Functor c, Foldable c) => c a -> [a]
toList c = fold (fmap (:[]) c)

验证示例

你可以用常见容器测试实现的正确性:

  • 对Maybe类型:
    • toList (Just 5) 先执行fmap (:[])得到Just [5],执行fold后得到[5]
    • toList Nothing 先执行fmap (:[])得到Nothing,执行fold后得到[]
  • 对列表类型:
    • toList [1,2,3] 先执行fmap (:[])得到[[1],[2],[3]],执行fold后得到[1,2,3]

补充说明

标准库原生的Foldable类型类自带toList方法,它的实现是foldr (:) [],不需要依赖Functor约束。但你的习题要求必须同时结合两个类型类的能力,上面的实现完全符合要求,同时用到了Functor的映射能力和Foldable的折叠能力。

内容的提问来源于stack exchange,提问作者program.exe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:02