我想定义一个代表单位向量的类型。
这就是我目前的情况:
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
的价值?
答案 0 :(得分: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)