考虑以下一对函数定义,它们通过类型检查器:
a :: forall a. a
a = undefined
b :: Int
b = a
也就是说,类型为forall a. a
的表达式可以被用在期望类型为Int
的地方。这对我来说看起来很像子类型化,但据称Haskell的类型系统缺乏子类型化。这些替换形式有何不同?
这个问题不仅限于forall a. a
。其他例子包括:
id :: forall a. a -> a
id x = x
idInt :: Int -> Int
idInt = id
undefined
不是 子类型化。这是一个错误。你为什么认为它是子类型化? - AJFmempty :: forall m. Monoid m => m
和let x = mempty :: [Int]
。意思是,mempty
是一个泛型函数,它接受一个符合 Monoid 接口的类型m
并返回一个该类型的空值。在这个例子中,x
被定义为[Int]
类型的空值。 - rampion[Int]
,但你不能写[forall a. a]
(除非你启用了不太适用于类型推断的不确定性)。 - chilens
库使用了全称多态和类型类编码出相当令人印象深刻的 "子类型层次结构",所以无论这是否算作子类型,它都可以用于此目的。 - Ørjan Johansen