Aquí están algunos pragmas y algunas importaciones:error de tipo 2 con rangos de tipos y composición de la función
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.ST
import Data.Array.ST
import Data.Array
Ahora aquí es mi problema. Los siguientes typechecks código:
foo :: forall a. a -> [a]
foo x = elems $ runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Sin embargo, cuando se sustituye la $
con la composición:
foo :: forall a. a -> [a]
foo x = elems . runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
me sale este error:
Couldn't match expected type `forall s. ST s (STArray s i0 e0)'
with actual type `ST s0 (STArray s0 Int a)'
In the expression:
newListArray (1, 10) (replicate 10 x) :: ST s (STArray s Int a)
In the second argument of `($)', namely
`do { newListArray (1, 10) (replicate 10 x) ::
ST s (STArray s Int a) }'
In the expression:
elems . runSTArray
$ do { newListArray (1, 10) (replicate 10 x) ::
ST s (STArray s Int a) }
¿Cuál es werid es, si me dan la función composición de su propio nombre, luego vuelve a marcar de nuevo:
elemSTArray = elems . runSTArray
foo :: forall a. a -> [a]
foo x = elemSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
No estoy seguro de lo que está pasando aquí. Esperaría que la segunda pieza de código sea chequeada muy bien. Y no entiendo por qué se vuelve a tipear si le doy a la función compuesta su propio nombre.
Esta es una versión simplificada de algún código que tuve que se rompió al actualizar de GHC 6.2 a 7 y estoy tratando de entender por qué sucede esto ahora. ¡Gracias por ayudar!
No soy realmente un programador de Haskell, pero ¿cuál es la precedencia de la composición relativa a '$'? ¿Qué sucede si entre paréntesis la sub-expresión 'elems. runSTArray'? – Gian
No puedo reproducir esto con GHC 6.12.1. – opqdonut
Gian: '$' tiene una prioridad menor que '.', de modo que si hago una paréntesis entre las expresiones secundarias, se comporta igual. opqdonut: Esto no me sucedió ni en GHC 6.2 pero sí en GHC 7.0.3 – Drekembe