命名仿函数的仿函数

Name a functor of functor

我一直在尝试将 Reflex to DMap 0.2 和 运行 更新为一个问题 t运行slating 一个嵌入式函子。

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

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

但是在最新版本的 DMap 中,您可以直接嵌入一个仿函数。我最初将 [] 从上面提取出来,但意识到由于我有一个仿函数的仿函数,所以我有一个仿函数并且想一起消除额外的数据。不幸的是,如果不使用新类型,我无法找到一种方法来描述上述映射。 newtype WeakSubscriberList a = WeakSubscriberList [WeakSubscriber a] 可以解决问题,但需要包装和解开新类型。

之前的研究指出这被认为是通常不允许的类型级别的 lambda,但这里的 t运行sformation 似乎很简单,它是可能的,特别是因为我不想定义一个实例或类似的东西。

使用 DMap 0.1 我们可以存储一个 FanSubscriberKey k 并且它的值是 DMap (FanSubscriberKey k) 中的一个 [WeakSubscriber a] 并且它的键被包装在 FanSubscriberKey 构造函数中。在 DMap 0.2 中,如果我定义了上面的 newtype,我可以类似地说 DMap k WeakSubscriberList 并得到一个类似的结果,它有一个未包装的键,但一个值包装在 WeakSubscriberList 中。然而,我想说的是 DMap k [WeakSubscriber] 但这显然行不通,因为 [] 是善良的 * -> *,而 WeakSubscriber 是善良的 * -> *。如果有一个类型级别 . 这样 [] '. WeakSubscriber 编译就可以了,但它同样不存在。我还尝试了类型别名,但 type WeakSubscriberList a = [WeakSubscriber a] 要求在使用 WeakSubscriberList 的任何地方指定 a

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

上面的例子变成了DMap k (Compose [] WeakSubscriber).