【发布时间】:2013-03-25 22:01:26
【问题描述】:
如果你想使用 GHC 的lexically scoped type variables,你也必须使用explicit universal quantification。也就是说,您必须在函数的类型签名中添加 forall 声明:
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}
f :: forall a . [a] -> [a] -- The `forall` is required here ...
f (x:xs) = xs ++ [x :: a] -- ... to relate this `a` to the ones above.
这实际上与量化有关吗,或者扩展编写者只是将forall 关键字用作新的更广泛范围适用的方便标记?
换句话说,为什么我们不能像往常一样省略forall?函数体内注解中的类型变量指的是函数签名中的同名变量,这不是很清楚吗?还是打字会有问题或模棱两可?
【问题讨论】:
-
我在下面提交了自己的答案,但我想知道是否还有我没有考虑到的其他细微之处。 ...
-
由于 Haskell-98 没有作用域,因此仅使用 forall 引入的作用域变量是一种折衷方案。这样,旧代码在打开 ScopedTypeVariables 时仍然有效。 (可以说,Haskell 应该总是有作用域类型变量。)
标签: haskell ghc type-systems quantifiers type-extension