参数化多态函数
考虑以下函数:
f :: a -> Int
f x = (1 :: Int)
我们可以说f
is的类型a -> Int
,f
因此它是“多态”类型。
以下哪项是最准确的思考方式f
?
实际上有一个
f
typea -> Int
。但是,它可以用作 、f :: Int -> Int
等f :: Double -> Int
。从字面上看,类型
f
是 NOTa -> Int
。实际上,这只是一种简写方式,即存在一个类型为具体的函数族f
(即,有 anf :: Int -> Int
、anf :: Double -> Double
等;此外,这些函数中的每一个都彼此不同)。
高等类型
同样,我们可以考虑以下类型声明:
data Maybe a = Just a | Nothing
并问两种观点哪个更正确:
没有单一类型
Maybe
;实际上,只有一个具体类型的族(Maybe Int
、Maybe String
等),仅此而已。实际上只有一种类型
Maybe
。这种类型是更高种类的类型。当我们说它是“类型”时,我们的意思是字面意思(不是 (1) 的简写)。碰巧我们也可以编写Maybe Int
,Maybe Double
等来生成不同的类型(它们恰好是具体的)。但是,归根结底(即):Maybe
、Maybe Int
和Maybe String
表示三种不同的类型,其中两种是具体的,另一种是高级的。
问题摘要
在 Haskell 中,“高级类型”真的是类型吗?或者只是具体类型是“真正的类型”,当我们谈到“高级类型”时,我们只是表示一个具体类型的族。此外,参数化多态函数是表示单一类型的函数,还是仅表示具体类型的集合函数(仅此而已)?