2016-03-30 9 views
5

Scalaの密閉型ファミリで注文を自動的に引き出すことは可能ですか?これは何か型崩れのように感じてScalaで自動的にシールされた密閉型trait/ADTの注文

sealed trait Letters 
case object A extends Letters 
case object B extends Letters 

(A < B) == True 

を扱うことができるかもしれないが、これが現在存在している場合、私は見ることができません。

例えば、行うことができるようにいいだろう。

答えて

5

私は、順序をコンストラクタの名前で並べるのではなく、定義の順序を反映させたいと思っています。

ClassSymbol APIのknownDirectSubclassesは、順序付けられたシーケンスではなく、一連のシンボルを返すため、これは期待するほど楽しいものではありません。私はスカラックの内部の専門家ではないが、according to Eugene Burmako(誰がいる)の署名は、knownDirectSubclassesの署名はscalacで起こっていることを反映している。

私は何年もの間、complaining about thisでした。ところで、様々な点で私はreading positions off the symbolsのようなものを試しましたが、実際には機能しません。

シェパレスの一般的な機械はシールされた特性をその製品を注文する副産物として表しているため、ここで決定する必要があります。確定的なものを維持するために、それはケースを注文するコンストラクタの名前を使用しています。

// Entering paste mode (ctrl-D to finish) 

sealed trait Letters 
case object B extends Letters 
case object A extends Letters 

// Exiting paste mode, now interpreting. 

defined trait Letters 
defined object B 
defined object A 

scala> shapeless.Generic[Letters] 
res5: shapeless.Generic[Letters]{type Repr = shapeless.:+:[A.type,shapeless.:+:[B.type,shapeless.CNil]]} = [email protected] 

これはあなたが望むものであるならば、あなたはすべてのセットばかりしている型崩れ搭載の汎用的な導出にgoodtutorialを見つけます詳細を確認してください。残念ながら、ほとんどの場合、それは(EastNorthSouthWestBlueGreenRed?)しかし、あなたが望むものはおそらくありませんし、何を(定義順)欲しいのは合理的に可能ではないようです。

+0

例は、例示のみであるかもしれないが、それの顔に、アルファベット順に(型崩れが提供するものである)を正確に何のために求められていますですここに;-) –

+0

@MilesSabinフェア十分!それは、アルファベットのコンストラクタ名があなたが望むところであると私が考えることができる唯一の例です。 :) –

0

Enumeratumを書くとき、私はTravisと同じ結論に達した。knownDirectSubclassesは宣言の順序についての情報を提供できない。

しかし、特定のモジュールの本体内では、ASTはまだ注文されています(タイプはList[Tree]です)。それでdeclaration-based ordering workを作り、indexOfメソッドを提供しました。シールされた特性インスタンスの順序付きシーケンスを取得したら、Orderを取得することはかなり簡単です。

申し訳ありませんが、これは型崩れの答えではありません...問題の

関連する問題