2016-12-14 20 views
4

我对Haskell比较新,我想了解HList的定义之一。了解HList的这个定义

data instance HList '[] = HNil 
newtype instance HList (x ': xs) = HCons1 (x, HList xs) 
pattern HCons x xs = HCons1 (x, xs) 

我有几个具体的问题:

  • 什么是'[](x ': xs)语法我看到?它几乎看起来像是在可变参数类型参数上的模式匹配,但是我从未见过这种语法,也不熟悉Haskell中的可变参数类型参数。我想这是GHC's Type Families的一部分,但我在链接页面上看不到任何关于此的内容,而且在Google中搜索语法相当困难。

  • 是否有使用带有一个元组(而不是data声明有两个字段)除了避免HCons1拳击newtype声明任何一点?

回答

8

首先,您缺少部分定义:data family声明本身。

data family HList (l :: [*]) 
data instance HList '[] = HNil 
newtype instance HList (x ': xs) = HCons1 (x, HList xs) 

这被称为data family(下TypeFamilies扩展可用)。

pattern HCons x xs = HCons1 (x, xs) 

这是一个双向模式(可在PatternSynonyms扩展名下获得)。

什么是我看到的'[](x ': xs)语法?

当您在构造函数前面看到'标记时,表示它们的标记为promoted type-level counterparts。作为一个语法上的方便,promoted lists and tuples也只需要额外的蜱(我们仍然可以编写'[]为类型级别利弊空类型级列表和':。所有这一切都可以通过DataKinds扩展。

是否有除了避免HCons1拳击?

是的,这是确保HList有代表性role,在使用了元组(而不是有两个字段的数据声明)一newtype声明的任何点,这意味着你可以控制ce HList s 。这是一个有点太参与只是一个答案来解释,但在这里是那里的东西不要去,因为我们希望,当我们有

data instance HList (x ': xs) = HCons x (HList xs) 

代替newtype instance(无图案)的例子。考虑以下newtype S的都是表象等同于IntBool()分别

newtype MyInt = MyInt Int 
newtype MyBool = MyBool Bool 
newtype MyUnit = MyUnit() 

回想一下,我们可以使用coerce包或自动解开这些类型。好了,我们希望能够做同样的事情,但对于整个HList

ghci> l = (HCons 3 (HCons True (HCons() HNil))) :: HList '[Int, Bool, ()] 
ghci> l' = coerce l        :: HList '[MyInt, MyBool, MyUnit] 

这工作与newtype instance变种,但不是因为角色的data instance之一。 (更多关于该here


技术上,有一个data family作为一个整体没有任何作用:角色可以为每个instance/newtype不同 - 这里我们只真正需要的HCons情况具有代表性,因为那是被强制执行的。 Check out this Trac ticket

+0

'(l :: [*])'是否意味着一个类型参数'l'被约束成类型'[*]'? – Textfield

+1

@Textfield正好!一个类型参数是一个提升的类型列表。想想看,编译出来可能需要打开'KindSignatures',并且可能还需要导入'Data.Kind' ...只要做一下GHC的建议即可。 :) – Alec

2
'[]

(x ': xs)是类型级列表语法在这个意义上,DataKinds language extension allows promoting types to kinds and constructors to types;即如果k是某种,那么'[k]也是一种,并且'[]'[k]的一种类型,并且如果t :: kts :: '[k],则t ': ts :: '[k]。一切都变了一个。

所以在HList (x ': xs)xxs匹配两种类型:x相匹配的“正常”的类型的种类*(例如Int)和xs匹配的样'[*]另一种类型的级列表。右侧定义了一个(newtype)数据类型,该数据类型的构造函数HCons1的参数类型为(x, HList xs)

举个例子,我们可以有

HCons1 (1, HCons1 (True, HNil)) :: HList '[Int, Bool] 

或者使用模式同义词:

1 `HCons` True `HCons` HNil :: HList '[Int, Bool] 

我没有一个很好的答案,您对为什么它表示为第二个问题带元组的新类型。