在实例头中具有行类型的类型类实例?

时间:2016-05-14 20:22:43

标签: typeclass purescript

当我在使用PureScript时,我发现我想编写一个类型类Sync,它等待Aff monad中的任意异步值解析。我写的类型类看起来像这样:

class Sync s eff a where
  sync :: s -> Aff eff a

现在我想为websocket连接创建Sync实例,它将等到连接打开并可用于读/写。我写的实例看起来像这样:

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)

不幸的是,现在我再次陷入困境,因为我不知道有什么方法可以WebSocketAffMonadAff一个lapply(Explanatory, function (x) lm(x~.+I(V1^2), data = Response)) 实例,原因与我在开始时遇到的类似。

我是否可以使用任何技巧来完成这项工作而不会完全违背通用主义的目的?或者,这种东西目前在PureScript中是不是真的可以表达?

2 个答案:

答案 0 :(得分:1)

从编译器版本0.10.3开始,只要通过FunDep确定行,就可以使用实例头中的行:

e.g。

PC File

发行说明v0.10.3:https://github.com/purescript/purescript/releases/tag/v0.10.3

答案 1 :(得分:-1)

我在我的移动ATM上,所以我无法对此进行测试,但您是否尝试过使用forall?

instance syncConnection :: forall eff. Sync Connectionync Connection . . .