朱莉娅的多态函数和子类型

时间:2016-11-22 21:10:18

标签: julia

我正在学习Julia,为此目的,我正在为某些非指定任务构建调度程序的模拟。为此,我想创建一个抽象类型,它代表状态的概念。任务可以处于任何接受状态,未完成状态,正在运行状态,已完成状态:

abstract RequestState 

然后我添加了一些具有RequestState为超级状态的具体状态:

immutable StateAccepted <: RequestState 
       name :: String 
end 

因为每个状态都是不可变的,并且它没有一个有趣的结构,所有实例都是相同的,所以我实例化了一个上述类型的实例:

const Accepted = StateAccepted("Accepted")

我用宏生成这个,也许它是相关的。

现在出现了问题。我想写一个函数,它检查有效的转换。我现在只有一个骨架:

function checkTransition{T <: RequestState, Q <: RequestState}(t :: T, q :: Q) :: Bool 
  return true 
end      

我以为我应该阅读表达式:

 T <: RequestState 

像forall T这样的东西,它是RequestState的子类型,但我认为这是错误的。

我希望这段代码可以编译。问题是我不理解错误,也无法在文档中找到任何内容。请注意,这可能是因为我不熟悉这种语言。相关错误是:

 Error During Test
  Expression evaluated to non-Boolean
   Expression: checkTransition(Accepted,Running)
   Value: ResourceScheduler.StateRunning("Running")
 ERROR: LoadError: There was an error during testing
   in record(::Base.Test.FallbackTestSet, ::Base.Test.Error) at      ./test.jl:397
    in do_test(::Base.Test.Returned, ::Expr) at ./test.jl:281
    in include_from_node1(::String) at ./loading.jl:488
    in process_options(::Base.JLOptions) at ./client.jl:262
    in _start() at ./client.jl:318
    while loading /home/eklerks/.julia/v0.5/ResourceScheduler/test/runtests.jl

如何使泛型函数仅接受RequestState的子类型参数?

编辑:

根据要求进行违规测试:

@test checkTransition(Accepted, Running) 

但这并没有成功,因为我在更改后忘记更新并安装我的包。在此更改之前,请阅读:

function checkTransition{T <: RequestState, Q <: RequestState}(t :: T, q :: Q) :: Q 
    return q 
end 

哪个是错误的来源。类型Q确实不是布尔值。那时我正在试验类型系统。

1 个答案:

答案 0 :(得分:4)

虽然您的代码应该有效,但通常会写一个

checkTransition(t::RequestState, q::RequestState) = true

而不是使用不必要的T <: RequestState参数化。请注意f{T <: X}(::T)不应被视为&#34;对于T&#34;的所有X子类型,而是&#34;存在T子类型X&#34;,因为这是existential type而不是通用类型。

您获得的错误是由于checkTransition(Accepted,Running)返回非布尔值,这必定是由于与您发布的代码无关的错误所致。