如何解决Haskell类型同义词可以用作类型构造函数吗?
我正在编写一个基准,以比较给定任务上许多Haskell集合(包括STArray
)的性能。为了消除重复,我正在尝试编写一组为这些集合提供统一接口的函数,以便可以将任务实现为多态的高阶函数。更具体地说,该任务是根据多态monad来实现的,对于ST s
,STArray
是Identity
;对于HashMap
这样的集合,Identity
则通常不需要在单子里操纵。
由于一致性要求,我不能直接使用HashMap
和ST
类型,因为我需要它们的种类来匹配STArray
和type Identity' s a = Identity a
type HashMap' s i e = HashMap i e
-- etc.
的种类。我认为实现此目的的最简单方法是使用幻像参数定义类型同义词:
ST
不幸的是,这是行不通的,因为当我尝试在将STArray
和The 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(带有-XRank2Types
和Generic
)。但是根据用例的需要,用newtype
或data
声明替换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}},Monad
和Identity'
实例,并且这意味着我必须为集合编写其他包装和展开代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。