我有一条记录,其中两个字段在初始化时应该是0
,并且只能由内部函数更新。
我怎样才能做到这一点?我在哪里保持内部状态?要求用户请提供0
作为参数而不是触及这些字段?
答案 0 :(得分:2)
您可以使用模块上的exposing
关键字限制模块公开的类型和功能。但是,您无法隐藏记录类型的各个字段。让我们首先定义您想要保密的记录别名:
type alias InternalModel =
{ foo : Int
, bar : Int
}
首先,我们需要一种方法来隐藏值的内部。这通常通过暴露类型但没有构造函数来完成。
module MyModule exposing (Model)
type Model = Model InternalModel
以上代码根本不允许外部模块查看InternalModel
类型参数或与之交互。您甚至无法在此模块之外创建Model
。这是我们可以定义一个创建新Model
的函数并将这些初始值设置为零的地方。您还必须调整模块exposing
列表(此处我将创建外部模块设置bar
,同时将foo
默认为零):
module MyModule exposing (Model, newModel)
newModel : Int -> Model
newModel bar =
Model { foo = 0, bar = bar }
如果你想为字段公开“getters”和“setter”,你可以这样做:
module MyModule exposing (Model, newModel, getFoo, setFoo)
getFoo : Model -> Int
getFoo (Model {foo}) =
foo
setFoo : Int -> Model -> Model
setFoo foo (Model model) =
Model { model | foo = foo }