Haskell 命名函子的函子
我一直在尝试更新到,但在翻译其中一个嵌入式函子时遇到了一个问题 具体来说,它以前使用GADT对Haskell 命名函子的函子,haskell,gadt,Haskell,Gadt,我一直在尝试更新到,但在翻译其中一个嵌入式函子时遇到了一个问题 具体来说,它以前使用GADT对a->[WeakSubscriber a]关系进行编码,如下所示: data FanSubscriberKey k a where FanSubscriberKey :: k a -> FanSubscriberKey k [WeakSubscriber a] 然而,在最新版本的DMap中,您可以直接嵌入一个函子。我最初从上面提到了[],但我意识到,由于我有一个函子中的函子,所以我有一个函子
a->[WeakSubscriber a]
关系进行编码,如下所示:
data FanSubscriberKey k a where
FanSubscriberKey :: k a -> FanSubscriberKey k [WeakSubscriber a]
然而,在最新版本的DMap中,您可以直接嵌入一个函子。我最初从上面提到了[]
,但我意识到,由于我有一个函子中的函子,所以我有一个函子,并希望一起消除多余的数据。不幸的是,如果不使用newtype,我无法找到描述上述映射的方法newtype WeakSubscriberList a=WeakSubscriberList[WeakSubscriber a]
可以解决问题,但需要包装和展开新类型
以前的研究指出,这被认为是一种类型级别的lambda,这通常是不允许的,但这里的转换似乎足够简单,可以实现,特别是因为我不想定义实例或类似的东西
使用DMap 0.1,我们可以在DMap(FanSubscriberKey)中存储一个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
。是间接避免newtype
的直接方法。它仍然涉及一个newtype
,因为这就是Compose
的定义方式,但不需要定义新的类型
上面的例子变成了DMap k(Compose[]WeakSubscriber)
你能把它变得更具体吗?也许包括一些更相关的定义和代码?我也很难理解这个问题,但也许是答案。这是一个newtype
,需要包装和展开。@LuisCasillas:这可能是最好的答案,我以前发现过,但因为它不是一个干净的解决方案,所以对它打了折扣,但它比定义的newtype
要好。随着Haskell代码变得越来越抽象,新类型包装变得越来越普遍。也许只是接受打击。。。如果您愿意,可以使用库让您的生活更轻松。@LuisCasillas:我选择了撰写,所以添加了它作为答案,如果您想创建一个答案,我会将其标记为正确答案,因为理想答案似乎不可能。