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

tur*_*tle 2 haskell vector

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

import Data.Vector
let x = fromList [["a", "b", "12", "d"], ["e", "f", "34", "g"]...]
Run Code Online (Sandbox Code Playgroud)

我想将字符串转换为每个嵌套列表中位置2的整数,我试图用map和这样的理解来做到这一点:

let y = Data.Vector.map (\a -> read a :: Int) [i !! 2 | i <- x]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我希望输出为:

(("a", "b", 12, "d"), ("e", "f", 34, "g")...)
Run Code Online (Sandbox Code Playgroud)

bit*_*ket 8

这里有很多问题.

首先,列表推导的结果是一个列表,所以你要调用Data.Vector.map一个列表,这将无法工作.x理解中的内部是一个Vector,这是另一种类型的不匹配.使用列表而不是Vector(连同Prelude.map)或将列表转换为a Vector(在这种情况下,您不能使用列表推导).

其次,忽略列表/ Vector问题,[i !! 2 | i <- x]将为您提供一个列表,其中仅包含每个子列表中位置2的元素.使用你的例子,理解就会产生["12", "34"].然后当你映射read它时,你会得到[12, 34],而不是你正在拍摄的输出.

最后,您想要查看的输出对列表或VectorsHaskell 无效.两种类型的容器必须是同质的,即它们不能包含多于一种类型的值.A [Int]不能包含Strings,也不能[String]包含Ints,但是你想要的输出包含两者.有一些方法可以使用存在类型来解决这个问题,但是对于您的潜在问题而言,有可能比尝试构建异构集合更好.

编辑:您编辑了帖子的最后一部分以使用元组,因此上面的段落不再适用.不过,我提到的前两个问题仍然存在.

如果你从一个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")]
Run Code Online (Sandbox Code Playgroud)