我正在学习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确实不是布尔值。那时我正在试验类型系统。
答案 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)
返回非布尔值,这必定是由于与您发布的代码无关的错误所致。