2009-05-05 3 views
4

ユニット数量のサポートが必要です。私は、型システムが可能な限りユニットの正しさを強制することを望みます。たとえば、グラムとドルを組み合わせることはできません。私はパラメータ化された型のパスを調べていますが、このコードは他の人から見たScalaコードよりはるかに反復しているようです。Scalaでユニットをきれいに表現する

abstract class UnitOfMeasure 

abstract class Range[T] { 
    type T <: UnitOfMeasure 
} 
class Quantity[T <: UnitOfMeasure](value: Double) 
class DefiniteRange[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T]) extends Range[T] 
class Confidence(conf: Double) { 
    require(0.0 <= conf && conf <= 1.0) 
} 
class ConfidenceInterval[T<:UnitOfMeasure](lowerBound: Quantity[T], upperBound: Quantity[T], confidence: Confidence) extends Range[T] { 
    def this(lower: Quantity[T], upper: Quantity[T]) = this(lower, upper, new Confidence(.90)) 
} 

もっとクリーンな方法がありますか? "T <:UnitOfMeasure"のドラムビートは、私を悩ます主なものです。

+5

は、私が唯一の他人のために自分の互換性サブタイプとない食べ物を食べることができる互換性のある食べ物を持っていた動物、およびサブタイプの基本タイプとdealth Scalaのブックでのプログラミングの例を見て思い出します。私はそれが関連しているように感じるが、わからない。おそらく本を持っている誰かが良いナゲットを見つけ出すことができます。 ソリューションの要点は、これらの分散注釈の代わりに基本クラスの型メンバーを全面的に使用することです。 – rndmcnlly

+0

mdmnclly、それはまさに正しいポインタでした。ありがとうございました!私はそれをアップヴォートできるように答えとしてあなたのコメントを投稿してください。 – mtnygard

+0

+1。私の負債は返済されます。 – akarnokd

答えて

4

私はちょうど

http://www.michaelnygard.com/blog/2009/05/units_of_measure_in_scala.html

はそれが役に立てば幸い、この記事を見つけました。 mdmcnllyから

+2

私もそれを投稿しようとしていたし、その記事の作者がこの質問の元のポスターである可能性が高いと分かった:)おそらく彼は今自分の質問に答えるべきだ... –

+1

はい、それは私だった。 私はこの質問を最初に書きました。それとは別に、ここで答えを待つ間に、私はリンク付きのツイートを受け取りました。私は図書館を調査し、図書館に基づいてそのブログ記事を書いた。 自分のブログにリンクして自分自身の質問に答えるのは奇妙なことだと思っていました。 – mtnygard

1

私は本を持っていませんが、おそらくself typeが必要です。クラスを別のクラスに囲み、クラススコープで使用する型定義を追加することができます。

1

は私が 互換性の食べ物を持っていた動物の基本型で をdealth Scalaの本の中でプログラミング、および だけ彼らの互換性を食べることができるサブタイプの例を見て思い出します サブタイプで、他の人には食べ物ではありません。私は のような気がしますが、私は ではありません。おそらく本のある人 が便利なナゲットを見つけ出すことができます。 解決策の要点は、代わりに 基本クラスの型メンバーを使用することです。 これらの分散注釈はすべて の場所にあります。

関連する問題