我想知道这是否是一个合理的功能请求(如果它已经存在并且我不知道如何访问它,那就更好了)。
为什么这是可取的一个例子是管道库。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 似乎在错误消息的“实际类型”部分记住了它,但我不知道编译器是如何工作的。)