是否可以增强GHC以在错误消息中打印类型别名?

时间:2014-11-26 20:00:40

标签: ghc haskell-pipes

我想知道这是否是一个合理的功能请求(如果已经存在并且我不知道如何访问它,那就更好了。)

为什么这是可取的一个例子是管道库。管道定义了一种类型:

data Proxy a' a b' b m r

有大量别名,其中一些是:

type Effect = Proxy X () () X
type Producer b = Proxy X () () b
type Pipe a b = Proxy () a () b
type Consumer a = Proxy () a () X

您可以想象,这是明确错误消息的最坏情况。作为一个阅读文档的程序员,您只需要参数较少的简单类型,但所有错误消息都是根据具有六个参数的怪物类型进行思考:

Couldn't match expected type ‘Proxy () Bool () b0 IO ()’
            with actual type ‘Int -> Pipe Bool Integer m0 r0’

如果该消息可能是这样的话会更清楚:

Couldn't match expected type ‘Pipe Bool Integer IO ()’
            with actual type ‘Int -> Pipe Bool Integer IO ()’

作为一个附带问题,为什么GHC会忘记它取代b0的特定类型Integer,而不知何故它会记得Bool?声明的类型是:

  (Monad m)
  => Int
  -> Pipe Bool Integer m r

无论如何......

是否可以更好地将类型别名的错误报告作为功能请求,或者GHC在检测到类型错误之前很久就会忘记别名? (在我看来,GHC必须跟踪别名,因为GHC似乎在"实际类型"错误消息的一部分中记住它,但我不知道编译器是如何工作的。)

0 个答案:

没有答案