参数化多态函数
考虑以下函数:
f :: a -> Int
f x = (1 :: Int)
我们可以说fis的类型a -> Int,f因此它是“多态”类型。
以下哪项是最准确的思考方式f?
实际上有一个
ftypea -> 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 中,“高级类型”真的是类型吗?或者只是具体类型是“真正的类型”,当我们谈到“高级类型”时,我们只是表示一个具体类型的族。此外,参数化多态函数是表示单一类型的函数,还是仅表示具体类型的集合函数(仅此而已)?