微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell类型同义词可以用作类型构造函数吗?

如何解决Haskell类型同义词可以用作类型构造函数吗?

我正在编写一个基准,以比较给定任务上许多Haskell集合(包括STArray)的性能。为了消除重复,我正在尝试编写一组为这些集合提供统一接口的函数,以便可以将任务实现为多态的高阶函数。更具体地说,该任务是根据多态monad来实现的,对于ST sSTArrayIdentity;对于HashMap这样的集合,Identity则通常不需要在单子里操纵。

由于一致性要求,我不能直接使用HashMapST类型,因为我需要它们的种类来匹配STArraytype Identity' s a = Identity a type HashMap' s i e = HashMap i e -- etc. 的种类。我认为实现此目的的最简单方法是使用幻像参数定义类型同义词:

ST

不幸的是,这是行不通的,因为当我尝试在将STArrayThe type synonym ‘Identity'’ should have 2 arguments,but has been given none 用作类型构造函数的地方使用这些同义词作为类型构造函数时,GHC会给出如下错误

-XLiberalTypeSynonyms

我遇到了type Generic i o = forall x. i x -> o x type Id x = x foo :: Generic Id [] GHC扩展名,并认为它可以使我做到这一点,正如documentation所说:

您可以将类型同义词应用到部分应用的类型同义词

并给出以下示例:

-XExistentialQuantification

该示例适用于GHC 8.0.2(带有-XRank2TypesGeneric)。但是根据用例的需要,用newtypedata声明替换newtype Generic i o = Generic (forall x. i x -> o x) type Id x = x foo :: Generic Id [] foo = Generic (\x -> [x]) 无效。 即以下代码会导致我在上面报告的同类错误

Identity'

问题

是否需要启用其他扩展程序才能使其正常工作?如果没有,那么是否有充分的理由不起作用,或者仅仅是疏忽?

解决方法

我知道我可以通过将newtype Identity' s a = Identity' a newtype Collection collection s i e = Collection (collection i e) -- etc. 等定义为完整类型来解决此问题,例如:

Identity

但是,这并不理想,因为这意味着我必须为Functor重新实现applicative的{​​{1}},MonadIdentity'实例,并且这意味着我必须为集合编写其他包装和展开代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。