我有一个大的嵌套向量,如下所示:
import Data.Vector
let x = fromList [["a", "b", "12", "d"], ["e", "f", "34", "g"]...]
我想将每个嵌套列表中位置 2 处的字符串转换为整数,我试图使用映射和这样的理解来做到这一点:
let y = Data.Vector.map (\a -> read a :: Int) [i !! 2 | i <- x]
我做错了什么?我希望输出是:
(("a", "b", 12, "d"), ("e", "f", 34, "g")...)
最佳答案
这里存在很多问题。
首先,列表理解的结果是一个列表,所以你调用 Data.Vector.map
在 list 上,这是行不通的。还有x
理解里面是 Vector
,这是另一种类型的不匹配。使用列表而不是 Vector (以及 Prelude.map
)或将列表转换为 Vector
(在这种情况下,您不能使用列表理解)。
其次,忽略列表/Vector
问题,[i !! 2 | i <- x]
将为您提供一个仅包含每个子列表中位置 2 的元素的列表。使用您的示例,理解将产生 ["12", "34"]
。然后当你映射read
时超过它,你会得到 [12, 34]
,而不是您要拍摄的输出。
最后,您想要看到的输出对于列表或 Vectors
无效在 haskell 。两种类型的容器必须是同类的,即它们不能包含超过一种类型的值。一个[Int]
不能包含String
s,[String]
也不能包含Int
s,但您想要的输出包含两者。您可以通过多种方法使用存在类型来解决此问题,但对于您的根本问题来说,很可能有比尝试构建异构集合更好的解决方案。
编辑:您编辑了帖子的最后部分以使用元组,因此上面的段落不再适用。不过,我提到的前两个问题仍然存在。
如果您从 4 元组列表 ( [(String, String, String, String)]
) 开始,您可以像这样得到您想要的内容:
> let x = [("a", "b", "12", "d"), ("e", "f", "34", "g")]
> map (\(a, b, c, d) -> (a, b, read c :: Int, d)) x
[("a", "b", 12, "d"), ("e", "f", 34, "g")]
关于haskell - 如何将函数应用于向量列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861920/