- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你将如何为可变数组和向量的各种实现创建一个单一接口(interface),同时保持它的实用性? IE。和:
-- (s)torage (k)ey (v)alue (m)onad
class (Monad m) => Storage s k v m where
empty :: k -> v -> m (s k v)
alter :: (v -> v) -> k -> s k v -> m ()
fold :: (a -> v -> a) -> a -> s k v -> m a
main :: IO ()
main = do
_a <- empty 100 False :: IO (IOUArray Int Bool)
_b <- empty 100 42 :: IO (VUM.MVector RealWorld Int)
let _c = empty 100 False :: ST s (STUArray s Int Bool)
let _d = empty 100 42 :: ST s (VUM.MVector s Int)
return ()
MArray 的实现可以是这样的(似乎有效):
instance (Monad m, MArray s v m, Ix k, Num k) => Storage s k v m where
empty k v = A.newArray (0, k - 1) v
alter f k s = A.readArray s k >>= A.writeArray s k . f
fold f a s = foldl' f a <$> A.getElems s
这是 MVectors 的一个损坏的实现:
-- doesn't work
instance (PrimMonad m, MVector s v, Unbox v) => Storage s k v m where
empty k v = VUM.replicate k v
alter f k s = VUM.modify s f k
fold f a s = VU.foldl' f a <$> VU.freeze s
问题:
{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses,
RankNTypes #-}
module UnifiedArray where
import Control.Monad.Primitive (PrimMonad, PrimState)
import Control.Monad.ST (RealWorld, ST, runST)
import Data.Array.IO (IOUArray)
import Data.Array.MArray (Ix, MArray)
import qualified Data.Array.MArray as A
import Data.Array.ST (STUArray)
import Data.Foldable (foldl')
import Data.Vector.Generic.Mutable (MVector)
import qualified Data.Vector.Unboxed as VU
import Data.Vector.Unboxed.Mutable (Unbox)
import qualified Data.Vector.Unboxed.Mutable as VUM
可运行源代码:
最佳答案
vector
类型不是索引类型的参数,因此您不能将它们硬塞到与 array
完全相同的界面中。是的。
但首先是一个更普遍的问题:
instance constraints => ClassName p q r
形式的实例只有一件事才真正有意义:定义一个类同义词,即一个与其父类(super class)基本相同的类†。
instance (m ~ IO, MArray IOArray e m, Ix k, Num k) => Storage IOArray k e m where
...
instance (m ~ IO, MArray IOUArray e m, Ix k, Num k) => Storage IOUArray k e m where
...
instance (m ~ ST, MArray STArray e m, Ix k, Num k) => Storage STArray k e m where
...
是的,这意味着一些代码重复,但它基本上只是微不足道的“链接定义”。
s
采用索引类型参数。这是可能的,因为
array
类型总是将索引作为第一个参数,即您可以使用 currying 将额外的变量硬烘焙到实例声明中。然后,您可以以关联类型族的形式再次检索该信息:
{-# LANGUAGE FlexibleInstances, FlexibleContexts, MultiParamTypeClasses, TypeFamilies #-}
module Asd where
import Control.Monad.Primitive (PrimMonad)
import Data.Array.IO (IOUArray)
import Data.Array.MArray (MArray)
import qualified Data.Array.MArray as A
import Data.Foldable (foldl')
import Data.Kind (Type)
import qualified Data.Vector as V
import qualified Data.Vector.Generic.Mutable as G
import qualified Data.Vector.Mutable as M
class (Monad m) => Storage s v m where
type IndexingKey s :: Type
empty :: IndexingKey s -> v -> m (s v)
alter :: (v -> v) -> IndexingKey s -> s v -> m ()
fold :: (a -> v -> a) -> a -> s v -> m a
instance (m ~ IO, MArray IOUArray v m, A.Ix k, Num k)
=> Storage (IOUArray k) v m where
type IndexingKey (IOUArray k) = k
empty k v = A.newArray (0, k - 1) v
alter f k s = A.readArray s k >>= A.writeArray s k . f
fold f a s = foldl' f a <$> A.getElems s
instance (PrimMonad m, s~M.PrimState m, G.MVector M.MVector v)
=> Storage (M.MVector s) v m where
type IndexingKey (V.MVector s) = Int
empty k v = M.replicate k v
alter f k s = M.modify s f k
fold f a s = V.foldl' f a <$> V.freeze s
{-# LANGUAGE ConstraintKinds #-}
type ClassName p q r = constraints
关于arrays - MArray 和 MVector 的统一接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66701520/
有没有办法创建一个参数类型,它表示一个可变长度的异构元组,其中元组的每个元素都是一个 MVector,这样 MVector 可以具有不同的长度,但它们包含相同的数字类型。所以在伪代码中,我想要这样的东
我可以理解为什么MVector类型(来自 vector 包)没有实例化 Foldable类型类? 我想人们经常需要迭代向量。我可以freeze到 Data.Vector然后迭代。但我讨厌改变这些东西,
我可以从多个并行线程安全地分配给 IOVector(来自 Haskell 矢量包)的非重叠索引,还是需要额外的互斥锁? 背景:我想并行运行一组 IO 计算,然后记录所有结果。我首先在列表中返回结果,但
如何构建IOVector来自 MVector ? IOVector 记录为: type IOVector = MVector RealWorld 我有一个如下所示的 MVector,我想构建 IOVe
你将如何为可变数组和向量的各种实现创建一个单一接口(interface),同时保持它的实用性? IE。和: 性能与直接使用数组/向量(无抽象)相当 最少重复代码 像这样的东西: -- (s)torag
我有一个应用程序,它花费大约 80% 的时间使用 Kahan summation algorithm 计算高维向量(dim=100)的大列表(10^7)的质心。 .我已尽力优化求和,但它仍然比等效的
我是一名优秀的程序员,十分优秀!