当我在玩 PureScript 时,我发现我想编写一个类型类Sync
来等待任意异步值在Aff
monad 中解析。我写的类型类是这样的:
class Sync s eff a where
sync :: s -> Aff eff a
现在我想Sync
为 websocket 连接创建实例,它会等到连接打开并且可用于读/写。我写的实例是这样的:
instance syncConnection :: Sync Connection (ws :: WEBSOCKET | eff) Unit where
sync (Connection socket) =
makeAff $ \fail continue ->
set socket.onopen $ \_ ->
continue unit
但是,我收到以下类型错误:
Type class instance head is invalid due to use of type
( ws :: WEBSOCKET
| eff
)
All types appearing in instance declarations must be of the form T a_1 .. a_n, where each type a_i is of the same form.
来自 Haskell,这对我来说很有意义——它反映了我需要启用FlexibleInstances
扩展的情况,PureScript 似乎也不支持——但我想知道我是否可以实现我想要的泛型。
我想也许我可以调整我的Sync
课程,然后创建一个新类型。
class Sync s m a where
sync :: s -> m a
newtype WebSocketAff a = WebSocketAff (Aff (ws :: WEBSOCKET) a)
不幸的是,现在我又被困住了,因为我不知道有什么方法可以给出与我一开始遇到的类似原因WebSocketAff
的实例。MonadAff
有什么技巧可以让我在不完全违背泛型目的的情况下让它工作吗?或者这种东西目前在 PureScript 中还不能真正表达?