Types 如何将自定义类型调用函数泛化为抽象类型?

Types 如何将自定义类型调用函数泛化为抽象类型?,types,julia,abstract,Types,Julia,Abstract,我有下面的模拟设置,有一个抽象类型,具体类型作为子类型,还有一个函数f,它接受两个参数,第一个参数是字母 abstract type Letter end struct A <: Letter end struct B <: Letter end f(::A, x) = ('a', x) f(::B, x) = ('b', x) a = A() b = B() 虽然这是可行的,但似乎是多余的,特别是考虑到字母可能有更多的子类型。我的尝试如下,但两者似乎都不起作用 julia&

我有下面的模拟设置,有一个抽象类型,具体类型作为子类型,还有一个函数
f
,它接受两个参数,第一个参数是
字母

abstract type Letter end

struct A <: Letter end
struct B <: Letter end

f(::A, x) = ('a', x)
f(::B, x) = ('b', x)

a = A()
b = B()
虽然这是可行的,但似乎是多余的,特别是考虑到
字母
可能有更多的子类型。我的尝试如下,但两者似乎都不起作用

julia> (t::Letter)(x) = f(t, x)
ERROR: cannot add methods to an abstract type

julia> (t::T)(x) where T <: Letter = f(t, x)
ERROR: function type in method definition is not a type
julia>(t::Letter)(x)=f(t,x)
错误:无法将方法添加到抽象类型

julia>(t::t)(x)其中t基于Dan的答案,元编程似乎是一条出路

for T in Symbol.(subtypes(Letter))
    @eval (t::$T)(x) = f(t, x)
end
按类型生成函数

或:


但是,这种将结构/子类型用作枚举的方法很棘手,我现在得到的唯一结果是:
foreach(T->(T::T)(x)=f(T,x),子类型(字母))
您的示例现在在Julia 1.0中运行,仅供参考。@nix您确定吗?我在1.0上看到了相同的错误消息。@HarrisonGrodin很抱歉我误解了您的请求。它现在仍然不起作用(v1.0.2)。它似乎与问题有关,问题仍然存在。
for T in Symbol.(subtypes(Letter))
    @eval (t::$T)(x) = f(t, x)
end
for T in Symbol.(subtypes(Letter))
    c = Char(lowercase(first(String(T))))
    @eval f(::$T, x) = ($c, x)
    @eval (t::$T)(x) = f(t, x)
end