2017-09-14 96 views
4

Haskell类型签名中的两种类型“a”和“t”之间是否存在任何差别,或者它只有类型“a”和类型“b”的不同名称?Haskell类型签名中类型“a”和类型“t”之间的区别是什么?

https://www.haskell.org/tutorial/goodies.html类型并[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'等 –

+3

不是一个完整的答案,但它可能有助于知道'foldl :: Foldable t =>(b - > a - > b) - > b - > ta - > b'是等价的到'foldl :: Foldable x =>(y - > z - > y) - > y - > xz - > y'和'app :: [t] - > t - > [t]'相当于'app :: [u] - > u - > [u]' – TobiMcNamobi

回答

2

在Haskell类型定义,类型名总是以大写字母开头,而类型的变量总是以小写字母开头。这些通常称为a,b等,但也可以称为f,m,t等。

通常情况下,在字母的开头字母被用于无限制类型的变量,而你经常看到fmt表示更具体的类型的变量,依此类推。

在特定示例

foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b 

t具体表示为是Foldable类型的类的一个实例。 t a表示容纳a类型值的任何“容器”Foldable

当你看到你的其他例子

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

还不如说[a] -> a -> [a],如果app是“自立”的功能。另一方面,如果app属于一个类型类,则该类型类定义可以包含更具体的t定义。

相关问题