2016-07-22 4 views
1

単位ベクトルを表す型を定義したいと思います。Elmの型の値を制限する

これは私が現在持っているものです。

type UVec = UVec Float Float 

unit : Float -> Float -> UVec 
unit a b = 
    let 
    norm = sqrt (a^2 + b^2) 
    in 
    UVec (a/norm) (b/norm) 

unitは私が望むものを得ている間、私はUVecは常にプログラムの他の部分の単位ベクトルであることを保証する方法がありません。例えば、私はこのような何か書くことができます:

wrong = UVec 100 200

をし、それがうまくコンパイルします。

unit関数をUVecタイプの唯一のコンストラクタにする方法はありますか?または、UVecの値を制限する何らかの方法ですか?

+1

、および'unit'関数だけをエクスポートして、他のモジュールが見ることができる唯一のものです – marcosh

答えて

4

あなたはモジュールでUVecを配置し、唯一のあなたが欲しいものを公開することができます:

module UnitVector exposing (UVec, unit, values) 

type UVec = UVec Float Float 

unit : Float -> Float -> UVec 
unit a b = 
    let 
    norm = sqrt (a^2 + b^2) 
    in 
    UVec (a/norm) (b/norm) 

values : UVec -> (Float, Float) 
values (UVec a b) = 
    (a, b) 

私はその上に機能を追加しましたあなたは、コンストラクタを露出していないので、あなたが値を取得することができます。

はあなたのような何かにモジュールのラインを変更します、あなたが実際に UVec Float Floatコンストラクタを公開したいと考えていました:おそらくあなたは別のモジュールであなたの `UVec`タイプと` unit`機能を持つことができ

module UnitVector exposing (UVec(UVec), unit, values) 
+0

別のモジュールを追加することなくこれを行うことができたと思っていましたが、これはやり方です。ありがとう! – user38602