2016-07-22 54 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