如何在haskell中展开列表(多维列表到一维列表)

  • 本文关键字:列表 一维 haskell haskell flatten
  • 更新时间 :
  • 英文 :


我想将任何维度列表展平为一维列表该代码适用于除空的2d列表之外的所有测试用例

import Prelude hiding (foldl)

foldl :: (b -> a -> b) -> b -> [a] -> b
foldl fun init list =
case list of
[] -> init
(head:tail) -> foldl fun (fun init head) tail

flatten_l :: [[a]] -> [a]
flatten_l xss = foldl ( ys xs -> ys ++ xs) [] xss

main = interact ( s -> show $ flatten_l [[1,2,3], [4,5], [6], [], [7,8,9], []] )

这不适用于输入-[[]]

main = interact ( s -> show $ flatten_l [[]] )

列表[]可能根据其类型以不同的方式显示*。最重要的例子是,[] :: String显示为"",而对于大多数其他列表类型,它是[]

为了在这些行为之间进行选择,您必须告诉GHC您希望[]具有哪种类型。比较:

-- ambiguous type variable error
main = print []
-- works, prints ""
main = print ([] :: [Char])
-- works, prints []
main = print ([] :: [Int])

*实际上,[]在这方面并不特别——任何列表都可能根据其类型而不同地显示。然而,在包含元素的列表中很少看到这个问题,因为元素是多态的是很少见的。因此,[]的特殊之处在于,它没有任何元素来向编译器提供关于其类型的提示,而不是它的实例取决于它的类型。

最新更新