类型多态元组

10

我注意到使用 PolyKindsDataKinds,以下代码可以顺利编译:

data Pair a b
data Test = Test
type Test2 = Pair 'Test 'Test
然而:
type Test3 = ('Test, 'Test)

很可能由于 (,) 不是种类多态的原因导致失败,这是有道理的,因为它根据其类型参数构造值,而不能构造不属于类别 * 的类型的值。

是否有一个具有种类多态元组的库(可以节省我的时间)?

我确实意识到,与真实元组不同,种类多态元组仅存在于类型级别,但这对于我的目的已经足够了。

1个回答

13
如果您已经在使用 DataKinds,那么您应该使用升级版的内置元组 构造器而不是类型构造器。
type Test3 = '( 'Test, 'Test)

这里有一个种类为 (Test, Test) 的东西。

请注意,在('之间必须有一个空格;'('Test, 'Test)是语法错误(解析器中必要的边缘情况)。


5
哦,那就是问题所在!这很有道理,'('当然会被解析成一个字符。 - Clinton
4
@Clinton,这是一个小技巧:你可能会发现定义FstSnd类型族非常有用,而且使用看起来很傻的约束条件x ~ '(Fst x, Snd x)也很重要。 - dfeuer
1
@dfeuer:是的,我几个月前已经为此制作了一个包,我将更新它以包括类型级元组:https://hackage.haskell.org/package/indextype-0.2.0.0 - Clinton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接