如何在错误消息中显示类型别名而不是参数类型

Col*_*ers 5 julia

我在julia中建立了一个参数类型:

type MyType{T}
    x::T
end
Run Code Online (Sandbox Code Playgroud)

为了简单起见,我为以下对象构建类型别名Float64

typealias MT MyType{Float64}
Run Code Online (Sandbox Code Playgroud)

我现在故意造成涉及的错误MT。例如:

y1 = MyType(1.0)
y2 = MyType(2.0)
y1 + y2
Run Code Online (Sandbox Code Playgroud)

会引发错误,因为+未为定义MyType。错误消息显示:

`+` has no method matching +(::MyType{Float64}, ::MyType{Float64})
Run Code Online (Sandbox Code Playgroud)

我想说:

`+` has no method matching +(::MT, ::MT)
Run Code Online (Sandbox Code Playgroud)

为什么?因为现实世界中的示例有时会比这个玩具示例复杂得多,并且类型别名的一个目的是使参数类型的复杂特定实例易于识别。因此,也很容易使它在错误消息中易于识别。

我尝试了什么?我最好的猜测是,错误函数string通过a 调用该函数DataType,以便在错误消息中生成适当的字符串。因此,对于我来说,可以string通过多次分派扩展功能以专门研究类型别名不是很明显,因此我对从何处去很困惑。

Sim*_*rne 5

您需要定义适当的show方法:

import Base.show
show(io::IO, ::Type{MT}) = print(io, "MT")
Run Code Online (Sandbox Code Playgroud)

然后,您的示例给出:

julia> y1 + y2
ERROR: `+` has no method matching +(::MT, ::MT)
Run Code Online (Sandbox Code Playgroud)

  • 从 1.6 开始,这将自动发生。 (2认同)