2017-06-23 14 views
2

範囲内の数値をラップする型をScalaで定義でき、コンパイル時にその妥当性を主張できるかどうかは疑問です。例:範囲[0,1]のすべての数値。したがって、BetweenZeroAndOne型の関数を定義できます。私は、数を保持する/ラップするケースクラスを定義することができ、実行時にその範囲内にあるかどうかをチェックし、暗黙的な変換も使用できるかどうかをチェックすることができます。しかし、ゼロと1の間の型の型を定義することは可能ですか?Scala - 範囲内の数値の型を定義する

おかげで、

+0

、あなたが話していた場合: は、純粋にScalaの機能で構築使用して次のようなものです:data Bool = False |真(ハスケル)。それで、私はあなたがこれをすることができないと思う。 – Pavel

+0

@Pavel私はhaskellについてよく分かりませんが、あなたの定義はOOの階層に似ています。真はBoolを拡張し、FalseはBoolを拡張します。私は絶え間ない価値観を求めています。 – vicaba

+0

あなたはどのくらいの大きさですか? – Pavel

答えて

3

使用refined:ここ

scala> type ZeroToOne = Not[Less[W.`0.0`.T]] And Not[Greater[W.`1.0`.T]] 
defined type alias ZeroToOne 

scala> refineMV[ZeroToOne](1.8) 
<console>:40: error: Right predicate of (!(1.8 < 0.0) && !(1.8 > 1.0)) failed: 
Predicate (1.8 > 1.0) did not fail. 
+0

OMG!私は今それをチェックするつもりです! – vicaba

0

が可能な解決策では、私が正しくあなたの質問を理解してほしい:

object MyInt extends Enumeration { 
    type MyInt = Value 
    // this is most "fragile" part of this solution 
    val Zero, One, Two, Three = Value 
} 

object MyIntToIntConverter{ 
    import MyInt._ 
    implicit def MyIntToInt(x: MyInt) : Int = x.id 
    implicit def IntToMyInt(x: Int) : MyInt = MyInt.apply(x) 
} 

import MyInt._ 
import MyIntToIntConverter._ 

val x : Int = MyInt.Three 

val t : MyInt = 3 
+0

このソリューションは離散的な範囲のみに対応していますか? – vicaba

+0

はい、必要に応じて手動でこれを拡張しています – Pavel

関連する問題