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

如何在Haskell中实现多维列表扁平化并修复空列表适配问题

问题分析

你当前实现的flatten_l函数类型签名为[[a]] -> [a],天生仅支持二维列表的扁平化操作,和Prelude自带的concat函数功能完全一致。你所说的输入[[]]运行“异常”实际是符合二维扁平化语义的正常结果:flatten_l [[]]会返回[],如果该结果不符合你的预期,说明你需要支持任意深度嵌套列表的通用扁平化能力。

任意维度嵌套列表扁平化实现

Haskell是静态强类型语言,要实现任意深度的列表扁平化,需要借助GHC的类型扩展和类型类做动态分派,实现代码如下:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}

class Flattenable a where
  flatten :: a -> [b]

instance {-# OVERLAPS #-} Flattenable [b] where
  flatten [] = []
  flatten (x:xs) = flatten x ++ flatten xs

instance {-# INCOHERENT #-} Flattenable b where
  flatten x = [x]

效果验证

你可以用以下测试用例验证功能:

  • 二维空嵌套输入:flatten [[]] 输出 []
  • 三维嵌套输入:flatten [[1,2], [[3], [4,5,[]]], 6] 输出 [1,2,3,4,5,6]
  • 你提供的原测试用例:flatten [[1,2,3], [4,5], [6], [], [7,8,9], []] 输出 [1,2,3,4,5,6,7,8,9]

内容的提问来源于stack exchange,提问作者Nitin bora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:03