亲切级别的括号是什么意思?

时间:2017-09-27 17:00:59

标签: haskell polymorphism type-kinds

我理解以下几种:

String :: *
[] :: * -> *
(->) :: * -> * -> *
(,) :: * -> * -> *

但这是什么意思,它代表什么类型?

? :: (* -> *) -> *

1 个答案:

答案 0 :(得分:2)

? :: (* -> *) -> *表示如果您向?提供某种类型* -> *,那么您将获得一种类型(某种类型*)。让我们举一个具体的例子:

newtype IntContainer f = IC { getContainer :: f Int }

这意味着包含Int。我可以使用列表,集合或任何我想要的(IntContainer)作为基础数据结构* -> *。问题是f在这里不是一种类型 - 它需要在类型之前应用另一种类型。因此:IntContainer需要应用一些内容,而这又需要应用一种类型。

ghci> :kind IntContainer
IntContainer :: (* -> *) -> *

我可以通过将* -> *种类的内容应用到IntContainer

来制作具体类型
ghci> ic1 = IC [1,2,3]
ic1 :: IntContainer []                           -- [] :: * -> *
ghci> ic2 = IC (Data.Set.fromList [1,2,3])
ic2 :: IntContainer Set                          -- Set :: * -> *
ghci> ic3 = IC (Data.Sequence.fromList [1,2,3])
ic3 :: IntContainer Seq                          -- Seq :: * -> *