haskell - 如何将函数应用于向量列表?

标签 haskell vector

我有一个大的嵌套向量,如下所示:

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/

相关文章:

haskell - 自动导出PathPiece

list - 检查两个列表是否以任意顺序具有相同的元素

haskell - 使用 GHC 的分析统计数据/图表来识别问题区域/提高 Haskell 代码的性能

haskell - 通过镜头获得值(value) s t a b

c++ - 将多个元素以多个偏移量插入到 vector 中

haskell - 使用 Cabal 安装 HTF 时遇到问题

c++ - 替换 std::vector 中的 shared_ptr 元素

c++ - 成为瓶颈时优化 `std::vector operator []`( vector 访问)

c++ - 拆分重叠段

c++ - 如何正确旋转 vector 以匹配另一个 vector ? (打开)