【问题标题】:Haskell: converting a list of tuples into a list of listsHaskell:将元组列表转换为列表列表
【发布时间】:2017-03-14 06:22:09
【问题描述】:

我有一个元组列表:

  [("book", 1,0), ("book", 2,0), ("title", 2,1)]

我想将整数转换为字符串的列表列表:

[["book, "1","0"], ["book , "2", "0"]...]

我试过了:

map(\(a, b, c) -> [a, b, c])myList

但我收到以下错误消息:

* No instance for (Num [Char]) arising from a use of `myList'

【问题讨论】:

    标签: list haskell tuples data-conversion


    【解决方案1】:

    您无法执行该转换。与元组不同,列表是同质的:它们仅包含相同类型的值。

    没有像["book",1,0] 这样的列表,因为它同时包含字符串和数字。例如,该列表不能有 [String] 类型,也不能有 [Int] 类型。

    【讨论】:

    • 有没有办法将元组中的整数转换为字符串?
    • 您可以使用 show 将 int 转换为字符串,例如map (\(a,b,c) -> [a,show b, show c]) 但我不确定您为什么要将所有内容都转换为字符串。元组列表通常比字符串列表更容易使用。
    【解决方案2】:

    除了@chi 的回答,你也可以试试IntString 的和,叫Either Int String

    concatMap
      (\(s, x, y) -> [Right s, Left x, Left y])
      [("book", 1, 0), ("book", 2, 0), ("title", 2, 1)]
    = [Right "book", Left 1, Left 0, Right "book",
      Left 2, Left 0, Right "title", Left 2, Left 1]
    

    但是,如果数字要与字符串相关联,则元组列表是一种高级结构。

    【讨论】:

      【解决方案3】:

      如果您确定您的元组是(String, Int, Int) 类型,那么您只需编写

      tupleToList :: (String, Int, Int) -> [String]
      tupleToList (a,b,c) = [a, show b, show c]
      

      并将其映射到你所拥有的,[(String, Int, Int)]

      更一般地说,

      tupleToList :: (Show a, Show b) => (String, a, b) -> [String]
      tupleToList (a,b,c) = [a, show b, show c]
      

      它允许您在输入元组的第二和第三位置插入任何可显示的东西,但不是更通用的:例如,你不能有

      • 元组长度不固定,如(a,b,c)(a,b,c,d)混合

      • 切换show对象,如(String, a, b)混合(b, String, a)

      -- 我的意思是,你首先如何将不同的元组存储在一个列表中?

      如果你真的想要的话,有一个叫做 Heterogenous list 的东西从来不推荐,你也不能从中得到太多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-05
        • 2023-03-11
        • 2018-12-19
        • 2012-06-05
        • 1970-01-01
        • 2022-09-27
        • 2020-02-28
        • 1970-01-01
        相关资源
        最近更新 更多