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