我正在尝试构建一个简单的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
类型类实现一个实例。我真的不理解这个错误。有谁能给我指个方向吗?
发布于 2017-01-16 10:08:48
Free
没有MonadEff
实例,因此不能在ComponentDSL
中使用liftEff
,因为它是Free
的同义词。
在下一个卤素版本中,这一点将发生变化,ComponentDSL
将拥有一个MonadEff
实例。对于当前发布的版本(v0.12.0),解决方案是使用"Non-state effects" section of the guide中提到的fromEff
函数。
https://stackoverflow.com/questions/41668064
复制相似问题