Haskell: 将元组列表转换为列表列表
Haskell: converting a list of tuples into a list of lists
我有一个元组列表:
[("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'
您无法执行该转换。与元组不同,列表是同类的:它们仅包含相同类型的值。
没有 ["book",1,0]
这样的列表,因为它同时包含字符串和数字。例如,该列表不能有类型 [String]
,也不能有类型 [Int]
。
除了@chi的回答,你也可以试试Int
和String
的和,叫做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]
但是,如果要将数字与字符串相关联,则元组列表是一种高级结构。
如果你确定你的元组是(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 的东西是不推荐的,你真的不能从中得到太多。
我有一个元组列表:
[("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'
您无法执行该转换。与元组不同,列表是同类的:它们仅包含相同类型的值。
没有 ["book",1,0]
这样的列表,因为它同时包含字符串和数字。例如,该列表不能有类型 [String]
,也不能有类型 [Int]
。
除了@chi的回答,你也可以试试Int
和String
的和,叫做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]
但是,如果要将数字与字符串相关联,则元组列表是一种高级结构。
如果你确定你的元组是(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 的东西是不推荐的,你真的不能从中得到太多。