使用无盒装载体自动分化

是否有一个Haskell库自动区分与无盒子的vector? Numeric.ADgrad函数需要一个Traversable的实例,而Data.Vector.Unboxed则不是。

我不知道为什么对的向量是作为向量对存储的,但是您可以轻松地为您的数据types编写实例来顺序地存储元素。

 {-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-} import qualified Data.Vector.Generic as G import qualified Data.Vector.Generic.Mutable as M import Control.Monad (liftM, zipWithM_) import Data.Vector.Unboxed.Base data Point3D = Point3D {-# UNPACK #-} !Int {-# UNPACK #-} !Int {-# UNPACK #-} !Int newtype instance MVector s Point3D = MV_Point3D (MVector s Int) newtype instance Vector Point3D = V_Point3D (Vector Int) instance Unbox Point3D 

此时最后一行会导致错误,因为Point3D没有vectortypes的实例。 他们可以写成如下:

 instance M.MVector MVector Point3D where basicLength (MV_Point3D v) = M.basicLength v `div` 3 basicUnsafeSlice ab (MV_Point3D v) = MV_Point3D $ M.basicUnsafeSlice (a*3) (b*3) v basicOverlaps (MV_Point3D v0) (MV_Point3D v1) = M.basicOverlaps v0 v1 basicUnsafeNew n = liftM MV_Point3D (M.basicUnsafeNew (3*n)) basicUnsafeRead (MV_Point3D v) n = do [a,b,c] <- mapM (M.basicUnsafeRead v) [3*n,3*n+1,3*n+2] return $ Point3D abc basicUnsafeWrite (MV_Point3D v) n (Point3D abc) = zipWithM_ (M.basicUnsafeWrite v) [3*n,3*n+1,3*n+2] [a,b,c] instance G.Vector Vector Point3D where basicUnsafeFreeze (MV_Point3D v) = liftM V_Point3D (G.basicUnsafeFreeze v) basicUnsafeThaw (V_Point3D v) = liftM MV_Point3D (G.basicUnsafeThaw v) basicLength (V_Point3D v) = G.basicLength v `div` 3 basicUnsafeSlice ab (V_Point3D v) = V_Point3D $ G.basicUnsafeSlice (a*3) (b*3) v basicUnsafeIndexM (V_Point3D v) n = do [a,b,c] <- mapM (G.basicUnsafeIndexM v) [3*n,3*n+1,3*n+2] return $ Point3D abc 

我认为大部分的函数定义是自我解释的。 点的vector存储为Ints的vector,第n点是3n,3n + 1,3n + 2个Ints。