2016-11-22 1 views
0

私は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 

RequestStateのサブタイプであるが、私は、これは間違っていると思うT FORALLのようなものとして。

このコードがコンパイルされると思います。問題は、私がエラーを理解していないとドキュメントで何も見つけることができないということです。私は言語に慣れていないので、これは可能性があることに注意してください。関連するエラーがある:

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のサブタイプの引数だけを受け入れる一般的な機能になるだろうか?

EDIT:

としては、問題のテスト要求:

@test checkTransition(Accepted, Running) 

をしかし、私は、私はそれを変更した後、私のパッケージを更新してインストールするのを忘れているため、これは、うまくいきませんでした。変更前は、

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

エラーの原因となっていました。タイプQは実際にはブール値ではありません。私はその時点でタイプシステムを試していました。

+1

なぜ失敗するのかわからない場合は、テストを投稿する必要があります。 –

答えて

4

あなたのコードは動作するはずですが、典​​型的には、1つの代わりに、不必要なT <: RequestStateパラメータを使用しての

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

を書き込みます。 f{T <: X}(::T)はサブタイプXと解釈されるべきではなく、existential typeでありユニバーサルタイプではないため、Xというサブタイプが存在することに注意してください。

エラーは、checkTransition(Accepted,Running)がブール値ではないことを示しています。これは、投稿したコードとは無関係の間違いである必要があります。

+0

ああ、ありがとう、私はそれが何かばかげていなければならないことを知っていた。問題のコードを追加し、私が作った間違いを文書化しました。それが普遍的なタイプではないことを指摘してくれてありがとう、私は実際にここに書くことを意味しました。 –

+0

これは、実存性と普遍的な定量化に関する興味深いコメントです...しかし、私はこの2つの実用的な違い、あるいはこの区別が型とジュリアコードの文脈で重要なケースを考えるのは苦労しています。 Tの宣言がRのサブタイプであるというシナリオでも、Rの一部のサブタイプが有効なパラメーターとして渡されないというシナリオはありますか? (そのような除外が後続の関数定義で明示的に行われる前は明らかです)。あるいは、意味論的観点から「テンプレート」タイプの概念をどのように解釈すべきかについて単にコメントしていますか? –

+1

@TasosPapastylianou現存型と普遍型は、型理論において特定の意味を持っています。オブジェクトはタイプが 'Vector {T}の場合はT 'であり、オブジェクトが' Vector {T} '型であるように' T 'が存在する場合などです。オブジェクトは、 'T {すべて} 'の場合、オブジェクトが' Vector {T}'型であれば、 'すべてのTに対してVector {T} '型(存在すると仮定する)の型になります。ジュリアにはその基準を満たすものはありません。 –

関連する問題