Ecco alcuni pragma e alcune importazioni:errore di tipo con rango-2 tipi e la funzione di composizione
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.ST
import Data.Array.ST
import Data.Array
Ora qui è il mio problema. I seguenti typechecks codice:
foo :: forall a. a -> [a]
foo x = elems $ runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Tuttavia, quando si sostituisce la $
con la composizione:
foo :: forall a. a -> [a]
foo x = elems . runSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
ottengo questo errore:
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) }
Cosa c'è werid è, se mi danno la funzione composizione il proprio nome, quindi riprova digitando nuovamente:
elemSTArray = elems . runSTArray
foo :: forall a. a -> [a]
foo x = elemSTArray $ do
newListArray (1,10) (replicate 10 x) :: ST s (STArray s Int a)
Non sono sicuro di cosa sta succedendo qui. Mi aspetto che il secondo pezzo di codice digiti bene. E non capisco perché riprova a digitare se conferisco il nome alla funzione composta.
Questa è una versione semplificata di un codice che ho avuto che si è rotto durante l'aggiornamento da GHC 6.2 a 7 e sto cercando di capire perché questo accade ora. Grazie dell'aiuto!
Non sono realmente un programmatore Haskell, ma qual è la precedenza della composizione relativa a '$'? Cosa succede se si parentesi la sottoespressione 'elem. runSTArray'? – Gian
Non riesco a riprodurlo con GHC 6.12.1. – opqdonut
Gian: '$' ha una precedenza inferiore rispetto a '.', quindi se parentesi la sottoespressione si comporta allo stesso modo. opqdonut: Questo non mi è successo né su GHC 6.2, ma su GHC 7.0.3 – Drekembe