限制Elm中的Type类型

时间:2016-07-22 16:36:43

标签: 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 个答案:

答案 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)