1

J'écris actuellement un petit compilateur pour un cours que je prends. J'ai donc commencé à écrire ce transformateur monade pour gérer le typochecking, mais j'ai eu une erreur de type très cryptique. Quelque chose impliquant des dépendances fonctionnelles, que je ne connais pas très bien. Un petit extrait du programme qui peut reproduire l'erreur:Que signifie cette erreur de typographie?

import Control.Monad.RWS.Lazy 
import qualified Data.Map as M 
import Control.Applicative 

--Placeholders for other data types. 
data TypeError = TypeError 
data Ident = Ident String 
data Type = Type 

type Typer a = RWS FunctionTable [TypeError] IdentTable a 

type FunctionTable = M.Map Ident Type 

type IdentTable = [M.Map Ident Type] 

emptyIdents :: IdentTable 
emptyIdents = [] 

getIdent :: Ident -> Typer (Maybe Type) 
getIdent id = getIdent' id <$> get 

getIdent' :: Ident -> IdentTable -> Maybe Type 
getIdent' _ [] = Nothing 
getIdent' id (x:xs) = 
    case M.lookup id x of 
    Just t -> Just t 
    Nothing -> getIdent' id xs 

putIdent :: Ident -> Type -> Typer() 
putIdent id ty = modify $ \xs -> case xs of 
    [] -> [M.singleton id ty] 
    (x:xs) -> (M.insert id ty x) : xs 

scopeEnter :: Typer() 
scopeEnter = modify $ \ids -> emptyIdents : ids 

scopeExit :: Typer() 
scopeExit = modify tail 

Et le message réel:

[1 of 1] Compiling Main    (ErrorExample.hs, interpreted) 

ErrorExample.hs:30:22: 
    Couldn't match type `M.Map Ident Type' with `Type' 
    When using functional dependencies to combine 
     MonadState 
     [[M.Map Ident Type]] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:35:18-23 
     MonadState 
     [M.Map Ident Type] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:30:22-27 
    In the expression: modify 
    In the expression: 
     modify 
     $ \ xs 
      -> case xs of { 
       [] -> [...] 
       (x : xs) -> (M.insert id ty x) : xs } 

ErrorExample.hs:30:22: 
    Couldn't match type `[]' with `M.Map Ident' 
    When using functional dependencies to combine 
     MonadState 
     [[M.Map Ident Type]] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:35:18-23 
     MonadState 
     [M.Map Ident Type] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:30:22-27 
    In the expression: modify 
    In the expression: 
     modify 
     $ \ xs 
      -> case xs of { 
       [] -> [...] 
       (x : xs) -> (M.insert id ty x) : xs } 

ErrorExample.hs:35:18: 
    Couldn't match type `Type' with `M.Map Ident Type' 
    When using functional dependencies to combine 
     MonadState s (RWST r w s m), 
     arising from the dependency `m -> s' 
     in the instance declaration in `Control.Monad.State.Class' 
     MonadState 
     [[M.Map Ident Type]] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:35:18-23 
    In the expression: modify 
    In the expression: modify $ \ ids -> emptyIdents : ids 

ErrorExample.hs:35:18: 
    Couldn't match type `M.Map Ident' with `[]' 
    When using functional dependencies to combine 
     MonadState s (RWST r w s m), 
     arising from the dependency `m -> s' 
     in the instance declaration in `Control.Monad.State.Class' 
     MonadState 
     [[M.Map Ident Type]] 
     (RWST 
      (M.Map Ident Type) 
      [TypeError] 
      [M.Map Ident Type] 
      transformers-0.2.2.0:Data.Functor.Identity.Identity), 
     arising from a use of `modify' at ErrorExample.hs:35:18-23 
    In the expression: modify 
    In the expression: modify $ \ ids -> emptyIdents : ids 
Failed, modules loaded: none. 
Leaving GHCi. 

Répondre

4

C'est un message d'erreur très mauvaise. La cause est due à une incompatibilité de type dans l'état. Votre code essaie de mélanger [Type d'identification M.Map] et [[Type d'identification M.Map]].

Si vous en ligne manuellement les emptyIdents remettent en scopeEnter il ressemble à ceci:

scopeEnter :: Typer() 
scopeEnter = modify $ \ids -> [] : ids 

... qui ne fait pas beaucoup de sens pour [M.Map Ident Type]. Comparez cela à la version qui fait typecheck:

scopeEnter :: Typer() 
scopeEnter = modify $ \ids -> M.empty : ids