我想实现一个算法,使用ST
monad和STUArray
s,我希望它能够同时使用Float
和Double
数据。STUArray with polymorphic type
我会演示一个简单的例子问题:计算一个记忆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 (i - 1)
>>= writeArray arr i . (+ val)
return arr
这种失败:
Could not deduce (MArray (STUArray s) a (ST s)) from the context()
arising from a use of 'newArray'
Possible fix:
add (MArray (STUArray s) a (ST s)) to the context of
an expression type signature
or add an instance declaration for (MArray (STUArray s) a (ST s))
我不能应用建议 “可能修复”。因为我需要在上下文中添加类似(forall s. MArray (STUArray s) a (ST s))
的内容,但这不可能是不可能的。
规则只有在编译时启用优化才会触发。 – 2010-02-08 21:14:49
我结束了现在使用不同的解决方法 - 请参阅下面的答案 – yairchu 2010-02-11 12:14:32