1

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

为什么这是可取的一个例子是管道库。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 似乎在错误消息的“实际类型”部分记住了它,但我不知道编译器是如何工作的。)

4

0 回答 0