假设我有以下类型:
data MyType = Constructor0 | Constructor1 | Constructor2
deriving (Eq,Show,Enum)
MArray (STUArray s) MyType (ST s) MArray IOUarray MyType IO
目前我将所有内容存储为Word8,然后使用(包装)fromEnum/toEnum进行转换,但感觉不对.我需要严格和拆箱,因为我在内存中使用大型数据结构(> 1.2Go),我无法懒得加载它.如果我找不到任何解决方案,我将重新实现C++中的所有内容,我希望避免使用当前项目.
我已经问了#haskell的问题,但我没有得到回复,也许这不是当天的好时机.
我想使用STmonad和STUArrays 实现一个算法,我希望它能够同时使用Float和Double数据.
我将演示一个更简单的示例问题:计算memoized scanl (+) 0(我知道它可以解决STUArray,只是使用例子).
{-# LANGUAGE FlexibleContexts, ScopedTypeVariables #-}
import Control.Monad
import Control.Monad.ST
import Data.Array.Unboxed
import Data.Array.ST
accumST :: forall a. (IArray UArray a, Num a) => [a] -> Int -> a
accumST vals = (!) . runSTUArray $ do
arr <- newArray (0, length vals) 0 :: ST s (STUArray s Int a)
forM_ (zip vals [1 .. length vals]) $ \(val, i) ->
readArray arr …Run Code Online (Sandbox Code Playgroud) 我想在得分类型中实现动态编程算法多态; 这是一个没有边界条件的简化1D版本:
{-# LANGUAGE ConstraintKinds, FlexibleContexts, RankNTypes, ScopedTypeVariables #-}
import Control.Monad
import Control.Monad.ST.Strict
import Data.Array.ST
import Data.Array.Unboxed
dynamicProgrammingSTU
:: forall e i . (
IArray UArray e,
forall s. MArray (STUArray s) e (ST s),
Ix i
)
=> (forall m . Monad m => (i -> m e) -> (i -> m e))
-> (i, i)
-> (i -> e)
dynamicProgrammingSTU prog bnds = (arr !) where
arr :: UArray i e
arr = runSTUArray resultArrayST
resultArrayST :: forall …Run Code Online (Sandbox Code Playgroud)