Purescript,理解为什么没有找到类型类实例

时间:2017-01-16 00:52:16

标签: haskell purescript

我正在尝试构建一个简单的Purescript应用程序,我无法弄清楚为什么我一直收到类型类实例错误。

具体来说,在我的Component内部,我定义了eval函数来操作我的查询代数。在这个过程中,我只是将一些东西记录到控制台以获得乐趣。

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

当我运行它时,编译器会喊:

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.

所以我指定了一个类型:

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

但是,编译器仍然告诉我需要为MonadEff类型类实现一个实例。我真的不明白这个错误。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

MonadEff没有Free个实例,因此您无法在liftEff中使用ComponentDSL,因为它是Free的同义词。

这在下一个卤素版本中发生了变化,ComponentDSL将有MonadEff个实例。对于当前发布的版本(v0.12.0),解决方案是改为使用fromEff函数,"Non-state effects" section of the guide中提到了该函数。