gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:51:40 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com