"TypeError: in Type, in parameter, expected Type got xyz" 在 Julia 中是什么意思?

3
我正在编写一些代码,但是出现了以下错误。
TypeError: in Type, in parameter, expected Type got xyz

有人能解释一下理论上会导致这种情况发生的原因吗? 这个错误信息实在没有帮助。 谢谢!


5
请问能否提供更多背景信息?你是如何遇到这个错误的?是否可以提供一个最小化的例子来重现这个问题?你当时尝试达成什么目标? - François Févotte
1
你应该阅读以下内容:https://stackoverflow.com/help/minimal-reproducible-example ,然后更新你的问题。这不需要很多,只需提供一个小的代码片段即可让任何人运行并理解你的问题。 - DNF
2个回答

5
一种获取此错误的方法如下。 假设您已定义了一个(非平凡的)类型XYZ:
julia> struct XYZ
         x :: String
       end

和该类型的一个实例:

julia> xyz = XYZ("foo")
XYZ("foo")


您可以使用 typeof 函数获取对象 xyz 的类型(即 XYZ):
julia> typeof(xyz)
XYZ


您可以以同样的方式获取 XYZ 的类型本身:
julia> typeof(XYZ)
DataType

然而,这将返回所有类型的DataType,当想要根据类型分配时,这并不是很有用。对于这些情况,存在Type"singleton type"。我认为我也看到它被称为“伪类型”,我觉得很容易理解:一切都像类型XYZ本身是Type{XYZ}类型一样工作:
julia> XYZ isa Type{XYZ}
true

julia> f(::Type{XYZ}) = 42
f (generic function with 1 method)

julia> f(XYZ)
42


然而,有一件事情是你无法做到的:以这种方式构建一个不是类型本身的对象的伪类型。
julia> Type{xyz}
ERROR: TypeError: in Type, in parameter, expected Type, got XYZ
Stacktrace:
 [1] top-level scope at REPL[3]:1


总之,你可能在一个对象xyz上使用了类似于Type{xyz}的东西,但实际上你想要的是以下之一:

  • Type{XYZ}来引用类型XYZ本身的(伪)类型
  • typeof(xyz)来获取对象xyz的类型

0

当我错误地定义NamedTuples的返回类型时,我遇到了非常相似的错误。

正确的方法是:

function fun(arg1::Int64, arg2::Float64)::NamedTuple{(:s1,:s2), Tuple{Int64, Float64}} 
    return (s1=arg1, s2=arg2) 
end

此外,检查返回实例的类型以查看类型签名的结构是很有用的,然后您可以直接复制粘贴。例如:
julia> typeof(fun(1, 2.))
NamedTuple{(:s1, :s2), Tuple{Int64, Float64}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接