2017-01-16 1 views
0

J'essaie de créer une application Purescript simple, et je n'arrive pas à comprendre pourquoi je continue d'obtenir une erreur d'instance de classe de type. Plus précisément, à l'intérieur de mon Component je définis la fonction eval pour fonctionner sur mon algèbre de requête. Dans le processus, je viens de connecter quelque chose à la console pour le plaisir.Purescript, comprendre pourquoi aucune instance de classe de type n'a été trouvée

type AppEffects eff = (HalogenEffects (console :: CONSOLE | eff)) 

data Query a = DoSomething a 

eval :: Query ~> H.ComponentDSL State Query (Aff (AppEffects eff)) 
eval (DoSomething a) = do 
    liftEff $ log "print me out!" 
    -- do some stuff with the action 
    pure next 

Quand je lance cela, le compilateur crie:

No type class instance was found for 

    Control.Monad.Eff.Class.MonadEff ("console" :: CONSOLE   
            | t0       
            )        
            (Free       
             (HalogenFP EventSource  
              { "someState" :: String 
              }       
              Query      
              (Aff      
               ("avar" :: AVAR  
               , "err" :: EXCEPTION 
               , "dom" :: DOM   
               , "console" :: CONSOLE 
               | eff1     
              )      
              )       
             )       
            )        

The instance head contains unknown type variables. Consider adding a type annotation. 

Je spécifié un type:

tryPrint :: Eff (console :: CONSOLE | eff) Unit 
tryPrint = log "print me out!" 

Cependant, le compilateur me dit toujours que je dois mettre en œuvre une instance pour le type de classe MonadEff. Je ne comprends pas vraiment cette erreur. Quelqu'un pourrait-il me pointer dans la bonne direction?

Répondre

2

Il n'y a pas d'exemple MonadEff pour Free, de sorte que vous ne pouvez pas utiliser liftEff dans ComponentDSL, car il est synonyme de Free.

Ceci est en train de changer dans la prochaine version d'Halogen, et ComponentDSL aura une instance MonadEff. Pour la version actuellement publiée (v0.12.0), la solution consiste à utiliser la fonction fromEff, qui est mentionnée dans le "Non-state effects" section of the guide.