我正在尝试构建一个简单的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
类型类实现一个实例。我真的不明白这个错误。有人能指出我正确的方向吗?
答案 0 :(得分:2)
MonadEff
没有Free
个实例,因此您无法在liftEff
中使用ComponentDSL
,因为它是Free
的同义词。
这在下一个卤素版本中发生了变化,ComponentDSL
将有MonadEff
个实例。对于当前发布的版本(v0.12.0),解决方案是改为使用fromEff
函数,"Non-state effects" section of the guide中提到了该函数。