我编写了一些代码,其中一小部分代码采用大型一维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
Run Code Online (Sandbox Code Playgroud)
错误是
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
Run Code Online (Sandbox Code Playgroud)
我已经写了一个类似的函数takeRowsList,它使外部Vector作为List,这不会遇到同样的问题.我也把它包括在上面但是评论出来,以证明我的问题.
我知道有些函数需要类型定义,当我将它们与Unboxed Vectors一起使用时.但在这种情况下,我很难在哪里放置类型定义.我已经尝试了很多类型定义一切,我不断收到上述错误.
在此先感谢您的帮助.
未装箱的向量需要知道其元素的大小,并且该大小必须是常量.向量可以具有不同的大小,因此它们不能是未装箱的向量的元素.但它们可能是盒装向量的元素,所以如果列表不适合你做的事情,你可以把它变成一个盒装向量(import qualified Data.Vector as B
用B而不是D来限定相关函数).
您不能让未装箱的向量包含另一个向量。只有某些原始数据类型可以拆箱,即为其Unbox
定义实例的数据类型。向量不是原始数据类型。
您可以做的是让您的函数返回未装箱向量的正常(装箱)向量。