Quiero aplicar un algoritmo mediante el ST
mónada y STUArray
s, y yo quiero que sea capaz de trabajar tanto con los datos Float
y Double
.STUArray con polimórfica tipo
Voy a demostrar sobre un problema de ejemplo más simple: el cálculo de un scanl (+) 0
memorado (Sé que se puede resolver sin STUArray
, simplemente utilizando como ejemplo).
{-# 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
Esta falla con:
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))
no puede aplicar el sugerido "solución posible". Porque tengo que agregar algo como (forall s. MArray (STUArray s) a (ST s))
al contexto, pero afaik es imposible ...
Las reglas solo se activan si se compilan con las optimizaciones habilitadas. –
Terminé usando una solución diferente por ahora - vea la respuesta a continuación – yairchu