ali*_*der 5 haskell type-inference
Haskell类型签名中的“ a”和“ t”这两种类型之间是否有区别,或者仅是诸如“ a”和“ b”类型之类的不同名称?
在https://www.haskell.org/tutorial/goodies.html中, [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]
Run Code Online (Sandbox Code Playgroud)
在 Haskell 类型定义中,类型名称总是以大写字母开头,而类型变量总是以小写字母开头。这些通常称为a,b等,但也可以称为f, m,t等。
通常情况下,在字母的开头字母被用于无限制类型的变量,而你经常会看到有更多的表示特定类型的变量f,m,t,等等。
在特定的例子中
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
Run Code Online (Sandbox Code Playgroud)
t专门表示为Foldable类型类的一个实例。t a表示任何Foldable保存类型值的“容器” a。
当你看你的另一个例子时
app :: [t] -> t -> [t]
Run Code Online (Sandbox Code Playgroud)
还不如说[a] -> a -> [a],如果app是“独立”功能。另一方面,如果app属于类型类,则该类型类定义可以包含更具体的t.