2016-07-22 44 views
1

我想定義表示一單位向量類型。限制類型的值在榆樹

這是我目前:

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

或許你可以在一個單獨的模塊,你'UVec'類型和'unit'功能,出口只有'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構造函數,你會模塊行更改爲類似:

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

希望我能做到這一點無需增加其他模塊,但看起來這是要走的路。謝謝! – user38602