ScopedTypeVariables

ScopedTypeVariables 允许你在声明中引用通用量化类型。更明确一点:

import Data.Monoid

foo::forall a b c. (Monoid b, Monoid c) => (a, b, c) -> (b, c) -> (a, b, c)
foo (a, b, c) (b', c') = (a::a, b'', c'')
    where (b'', c'') = (b <> b', c <> c') :: (b, c)

重要的是我们可以使用 abc 来指示编译器声明的子表达式(where 子句中的元组和最终结果中的第一个 a)。在实践中,ScopedTypeVariables 协助将复杂函数编写为部分之和,允许程序员将类型签名添加到没有具体类型的中间值。