【问题标题】:how to flatten list ( multi dimention list to one dimention list ) in haskell如何在haskell中展平列表(多维列表到一维列表)
【发布时间】:2021-12-31 13:16:32
【问题描述】:

我想将任意维度列表展平为一维列表 此代码适用于除空 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 [[]] )

【问题讨论】:

  • “维度”对您来说意味着什么?它似乎与大多数人所说的那个词的意思不一样——flatten_l 只是像大多数人所说的“维度”那样将维度 by 1 减少,它并没有减少to维度 1.“不工作”是什么意思?你得到什么输出?你希望得到什么?
  • 对于输入 [[]] ,我收到错误 - 使用“show”引起的不明确类型变量“a0”阻止了约束“(显示 a0)”的解决。我想要的输出是 []

标签: haskell flatten


【解决方案1】:

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

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

-- ambiguous type variable error
main = print []

-- works, prints ""
main = print ([] :: [Char])

-- works, prints []
main = print ([] :: [Int])

* 实际上,[] 在这方面并不特殊——任何列表都可能根据其类型以不同的方式显示。但是,对于包含元素的列表来说,这个问题很少见,因为元素很少是多态的。所以[] 的特殊之处实际上是它没有任何元素可以给编译器关于它的类型的提示,而不是它的实例依赖于它的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多