我一直在尝试将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)
。