gpt4 book ai didi

Haskell:如何在使用未装箱向量时修复 "add An Instance Declaration For (Unbox A)"错误?

转载 作者:行者123 更新时间:2023-12-03 14:26:30 25 4
gpt4 key购买 nike

我已经编写了一些代码,其中一小部分代码采用一个大的一维 Unboxed.Vector 并将它们作为 Vector (Vector a) 返回。

代码的一部分给出了错误。这是一段与实际代码相似的示例代码,并给出了相同的错误。

import Data.Vector.Unboxed as D


xs = [0,1,2,3,4,5,6,7,8,9,10,11]
rows = 3
cols = 4

sb = D.fromList xs

takeRows::Int -> Int -> Vector Int -> Vector (Vector Int)
takeRows rows cols x0 = D.map (\x -> D.slice x (fromIntegral cols) x0) starts
where
starts = D.enumFromStepN 0 cols rows

-- takeRowsList::Int -> Int -> Vector Int -> [Vector Int]
-- takeRowsList rows cols x0 = Prelude.map (\x -> D.slice x (fromIntegral cols) x0) starts
-- where
-- starts = D.toList . D.enumFromStepN 0 cols $ rows

错误是
No instance for (Unbox (Vector Int))
arising from a use of `D.map'
Possible fix: add an instance declaration for (Unbox (Vector Int))
In the expression:
D.map (\ x -> slice x (fromIntegral cols) x0) starts
In an equation for `takeRows':
takeRows rows cols x0
= D.map (\ x -> slice x (fromIntegral cols) x0) starts
where
starts = enumFromStepN 0 cols rows

我写了一个类似的函数 takeRowsList,它使外部 Vector 成为一个列表,并且不会遇到同样的问题。我也在上面包含它,但将其注释掉,以证明我的问题。

我知道有些函数需要类型定义,当我将它们与 Unboxed Vectors 一起使用时。但在这种情况下,我很难确定在哪里放置类型定义。我已经尝试了几乎所有类型的定义,但我不断收到上述错误。

在此先感谢您的帮助。

最佳答案

未装箱向量需要知道其元素的大小,并且该大小必须是常数。向量可以有不同的大小,因此它们不能是未装箱向量的元素。但是,它们可能是装箱向量的元素,因此如果列表不适合您的工作,您可以将其设为装箱向量( import qualified Data.Vector as B 并使用 B 而不是 D 限定相关函数)。

关于Haskell:如何在使用未装箱向量时修复 "add An Instance Declaration For (Unbox A)"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8196857/

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