Elm 我在哪里存储内部状态?

Elm 我在哪里存储内部状态?,elm,Elm,我有一个记录,其中两个字段在记录初始化时应为0,并且仅由内部函数更新 我怎样才能做到这一点?我在哪里保持内部状态?请用户提供0作为参数,不要触摸这些字段?您可以使用模块上的exposing关键字限制模块公开的类型和功能。但是,不能隐藏记录类型的单个字段。让我们首先定义要保持私有的记录别名: 类型别名内部模型= {foo:Int ,bar:Int } 首先,我们需要一种隐藏值内部的方法。这通常是通过公开类型而不公开构造函数来完成的 模块MyModule(模型) 类型模型=模型内部模型 上述代码

我有一个记录,其中两个字段在记录初始化时应为
0
,并且仅由内部函数更新


我怎样才能做到这一点?我在哪里保持内部状态?请用户提供
0
作为参数,不要触摸这些字段?

您可以使用模块上的
exposing
关键字限制模块公开的类型和功能。但是,不能隐藏记录类型的单个字段。让我们首先定义要保持私有的记录别名:

类型别名内部模型=
{foo:Int
,bar:Int
}
首先,我们需要一种隐藏值内部的方法。这通常是通过公开类型而不公开构造函数来完成的

模块MyModule(模型)
类型模型=模型内部模型
上述代码根本不允许外部模块查看
InternalModel
类型参数或与之交互。您甚至不能在此模块之外创建
模型
。在这里,我们可以定义一个函数,创建一个新的
模型
,并将这些初始值设置为零。您还必须调整模块
exposing
列表(在这里,我将让外部模块在创建时设置
bar
,同时将
foo
默认设置为零):

modulemymodule公开(Model,newModel)
新建模型:Int->Model
新模型酒吧=
模型{foo=0,bar=bar}
如果要公开字段的“getter”和“setter”,可以这样做:

modulemymodule公开(Model、newModel、getFoo、setFoo)
getFoo:Model->Int
getFoo(模型{foo})=
福
setFoo:Int->Model->Model
setFoo-foo(模型)=
模型{Model | foo=foo}

您可以使用模块上的
exposing
关键字来限制模块公开的类型和功能。但是,不能隐藏记录类型的单个字段。让我们首先定义要保持私有的记录别名:

类型别名内部模型=
{foo:Int
,bar:Int
}
首先,我们需要一种隐藏值内部的方法。这通常是通过公开类型而不公开构造函数来完成的

模块MyModule(模型)
类型模型=模型内部模型
上述代码根本不允许外部模块查看
InternalModel
类型参数或与之交互。您甚至不能在此模块之外创建
模型
。在这里,我们可以定义一个函数,创建一个新的
模型
,并将这些初始值设置为零。您还必须调整模块
exposing
列表(在这里,我将让外部模块在创建时设置
bar
,同时将
foo
默认设置为零):

modulemymodule公开(Model,newModel)
新建模型:Int->Model
新模型酒吧=
模型{foo=0,bar=bar}
如果要公开字段的“getter”和“setter”,可以这样做:

modulemymodule公开(Model、newModel、getFoo、setFoo)
getFoo:Model->Int
getFoo(模型{foo})=
福
setFoo:Int->Model->Model
setFoo-foo(模型)=
模型{Model | foo=foo}

foldp
可能就是您想要的。和
mergeMany
将多个事件源合并为一个事件源,您可以折叠生成表示内部状态的行为。我想提供一些链接,但文档站点目前没有为我加载。@clinux我使用的是最新版本的Elm。
foldp
在0.17之后是否仍然存在?另外,我也不知道这会有什么帮助。对,@FilipHaglund、
foldp
mergeMany
与这个问题无关。我不确定@clinux是什么意思。对不起,我误解了这个问题。不要理会我上面的评论。
foldp
可能就是你想要的。和
mergeMany
将多个事件源合并为一个事件源,您可以折叠生成表示内部状态的行为。我想提供一些链接,但文档站点目前没有为我加载。@clinux我使用的是最新版本的Elm。
foldp
在0.17之后是否仍然存在?另外,我也不知道这会有什么帮助。对,@FilipHaglund、
foldp
mergeMany
与这个问题无关。我不确定@clinux是什么意思。对不起,我误解了这个问题。忽略我上面的评论。您如何在记录中添加具有泛型类型的字段?e、 g.
Dict Int valueType
type Model a=Model(InternalModel a)
type alias InternalModel a={foo:Int,bar:a}
将允许您传入类型参数。当然,但是我如何将其传递给
newModel
函数而不传递该类型的值呢?在Elm中,您不可能真的有这样一个完全通用的函数
newModel:Int->Model a
,因为如果要返回
Model a
的值,必须在函数体中对其进行初始化,如果不知道
a
,您就无法在构建过程中为该值赋予任何有意义的内容。如果你真的需要做这样的事情,可能会有其他选择,但这可能更适合一个新问题,因为当这些注释线程太长时,SO会开始大叫。好的,是的,这是可能的,我的错:
newModel:Int->Model a
newModel foo=Model{foo=foo,bar=Dict.empty}
。这就是你想要的吗?你如何在记录中添加一个具有泛型类型的字段?e、 g.
Dict Int valueType
type Model a=Model(InternalModel a)
类型别名InternalModel a={foo:Int,bar:a}
将允许您传入一个类型参数。当然可以,但是我如何在不传递该类型的值的情况下将其传递给
newModel
函数?您不能真正拥有一个完全通用的f