Haskell:将元组列表转换为列表列表

时间:2017-03-14 06:22:09

标签: list haskell tuples data-conversion

我有一个元组列表:

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

我想转换成列表列表,其中int也转换为字符串:

[["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'

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

除了@ 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]

但是,如果数字与字符串相关联,则元组列表是一种优越的结构。

答案 2 :(得分:0)

如果您确定您的元组是(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]

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

  • 未定长的元组长度,例如(a,b,c)(a,b,c,d)混合

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

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

如果您真的想要,有一种名为Heterogenous list的东西从未被推荐过,而且您无法从中得到很多。