元组列表的类型构造函数是什么?

What is the type constructor for list of tuples?

问题

什么是类型构造函数,它生成具体类型,如[(Int,String)]

问题的来源

我认为这真的听起来像是一个愚蠢的问题或一个毫无意义的谜语。我希望下面的内容能让你相信我实际上是在努力寻找我对基础知识理解上的差距。

我知道[]

到"visualize"第二个方面,我直接打

> x = [1,2,3] :: [] Int
> :t x
x :: [Int]

这清楚地表明 [] 应用于具体类型 Int 给出了另一个具体类型 [Int].

到目前为止一切顺利。

另一方面,(,)也有两个含义:

> x = (1,1) :: (,) Int Int
> :t
x :: (Int, Int)
> (,) 1 "hello"
(1,"hello")

所以,如果 [](,) 都是类型构造函数,可以在其他类型中产生具体类型 [Int](Int,Char),我想知道什么是生成类似 [(Int,Char)].

类型的类型构造函数

与其说是单一类型构造函数,不如说是嵌套类型构造函数:

λ> x = [(1, 'a')] :: [] ((,) Int Char)
λ> :t x
x :: [(Int, Char)]

这种类型构造函数没有显式形式,但您可以自己编写:

type TupleList f s = [(f, s)]

TupleList 现在是一个有两个参数的类型构造函数。如果将它应用于类型 IntChar,它会构造一个类型 TupleList Int Char,它与 [(Int, Char)]:

同义
tupleList :: TupleList Int Char
tupleList = [(1, 'a'), (2, 'b')]