Haskell类型签名中的类型“a”和类型“t”有什么区别?

6
在 Haskell 类型签名中,“a” 和 “t” 两种类型有区别吗,还是只是不同的指定,就像类型 “a” 和类型 “b” 一样?
https://www.haskell.org/tutorial/goodies.html 中,类型 [a] 的定义如下:
[a] 是类型族,由每种类型 a 组成,表示 a 类型的列表。整数列表(例如 [1,2,3])、字符列表(['a','b','c'])甚至是整数列表的列表等都是该族的成员。(但请注意,[2,'b'] 不是一个有效的示例,因为没有单个类型包含 2 和 'b'。)
这个定义是否也适用于类型 “t”?
以下是一个例子:
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
  app :: [t] -> t -> [t]

1
这取决于签名中是否有类型限制与这些符号匹配。请展示相关的签名。 - Carcigenicate
3
如果类型变量没有出现在类型约束中,它们就只是普通的变量。这些变量的名称是任意的。但有时候使用更具语义的名称会更有用,比如 n 表示数字等。 - Willem Van Onsem
3
虽然不是完整的答案,但也许知道foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 相当于 foldl :: Foldable x => (y -> z -> y) -> y -> x z -> y,以及 app :: [t] -> t -> [t] 相当于 app :: [u] -> u -> [u] 可能会有所帮助。 - TobiMcNamobi
严格来说,“t”并不是指一种类型;它指的是一个类型级函数,返回一种类型。 - chepner
1个回答

6
在Haskell类型定义中,类型名称始终以大写字母开头,而类型变量始终以小写字母开头。通常称为a,b等,也可以称为f,m,t等。
通常,字母表开头的字母用于无限制的类型变量,而使用f,m,t等更具体的类型变量表示更多。
在特定示例中,
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b

t被特别指定为Foldable类型类的一个实例。t a表示任何Foldable容器,其中包含类型为a的值。

当您查看其他示例时

app :: [t] -> t -> [t]

如果app是一个“自由的”函数,那么它可能会说成[a] -> a -> [a]。然而,如果app属于一个类型类,那么该类型类的定义中可能包含t的更具体的定义。


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