10

有什么缺点ScopedTypeVariables,如果有的话?为什么默认不开启?它会导致更糟糕的推理吗?是否存在失败的边缘情况?在 GHC 中实施是否困难得多?

4

2 回答 2

10

这也是因为它改变了程序的语义(结合其他扩展)。考虑

{-# LANGUAGE RankNTypes #-}
foo :: forall a . (a -> a) -> (a -> a)
foo = bar
  where
    bar :: a -> a
    bar = id

它编译得很好,但ScopedTypeVariables它甚至无法编译。

于 2013-09-17T18:20:18.947 回答
8

默认情况下它不启用,原因与默认情况下所有其他扩展均不启用相同 - 它不是 Haskell 标准的一部分。

正如augustss所说 - 这需要类型检查器中的更多逻辑,但我认为没有人认为它是繁重的。

于 2013-09-17T15:39:23.917 回答