Je veux mettre en œuvre un algorithme utilisant la ST
monade et STUArray
s, et je veux qu'il soit en mesure de travailler avec les deux Float
et Double
données.STUArray avec le type polymorphes
Je vais démontrer sur un exemple simple problème: calcul d'un scanl (+) 0
memoized (je sais qu'il peut être résolu sans STUArray
, en utilisant comme exemple).
{-# 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
Cela échoue avec:
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))
Je ne peux pas appliquer le suggéré "solution possible". Parce que j'ai besoin d'ajouter quelque chose comme (forall s. MArray (STUArray s) a (ST s))
au contexte, mais c'est impossible.
Les règles se déclenchent uniquement si elles sont compilées avec les optimisations activées. –
J'ai fini par utiliser une solution de contournement différente pour l'instant - voir la réponse ci-dessous – yairchu