Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 命名函子的函子_Haskell_Gadt - Fatal编程技术网

Haskell 命名函子的函子

Haskell 命名函子的函子,haskell,gadt,Haskell,Gadt,我一直在尝试更新到,但在翻译其中一个嵌入式函子时遇到了一个问题 具体来说,它以前使用GADT对a->[WeakSubscriber a]关系进行编码,如下所示: data FanSubscriberKey k a where FanSubscriberKey :: k a -> FanSubscriberKey k [WeakSubscriber a] 然而,在最新版本的DMap中,您可以直接嵌入一个函子。我最初从上面提到了[],但我意识到,由于我有一个函子中的函子,所以我有一个函子

我一直在尝试更新到,但在翻译其中一个嵌入式函子时遇到了一个问题

具体来说,它以前使用GADT对
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:我选择了撰写,所以添加了它作为答案,如果您想创建一个答案,我会将其标记为正确答案,因为理想答案似乎不可能。