我一直在尝试将Reflex更新为DMap 0.2并遇到翻译嵌入式函子之一的问题。

具体来说,它以前使用GADT来编码a -> [WeakSubscriber a]关系,如下所示:

data FanSubscriberKey k a where
  FanSubscriberKey :: k a -> FanSubscriberKey k [WeakSubscriber a]


但是,在最新版本的DMap中,您可以直接嵌入函子。最初,我从上述内容中删除了[],但意识到由于我有一个函子的函子,所以我有一个函子,并希望一起消除所有多余的数据。不幸的是,如果不使用新类型,我将无法找到一种描述上述映射的方法。 newtype WeakSubscriberList a = WeakSubscriberList [WeakSubscriber a]将解决问题,但需要包装和拆开新类型。

先前的研究指出,这通常被认为是类型级别的lambda,但是这里的转换似乎足够简单,以至于有可能实现,特别是因为我不想定义一个实例或类似的东西。

使用DMap 0.1,我们可以存储FanSubscriberKey k并将其值设置为[WeakSubscriber a]DMap (FanSubscriberKey k)中,其键包含在FanSubscriberKey构造函数中。在DMap 0.2中,如果我定义了上面的newtype,我可以类似地说DMap k WeakSubscriberList,并且得到类似的结果,其中包含未包装的键,但包装在WeakSubscriberList中的值。但是我想说的是DMap k [WeakSubscriber],但是显然不起作用,因为[]* -> *类型,而WeakSubscriber* -> *类型。如果存在类型级别.,使得[] '. WeakSubscriber可以完成该技巧,但是类似地不存在。我也尝试过使用类型别名,但是type WeakSubscriberList a = [WeakSubscriber a]要求在使用a的任何地方都指定WeakSubscriberList

最佳答案

Data.Functor.Compose是间接避免newtype的直接方法。它仍然涉及newtype,因为这是定义Compose的方式,但是不需要定义新的。

上面的示例变为DMap k (Compose [] WeakSubscriber)

10-06 05:30