レコードが初期化され、内部関数によってのみ更新されるときに、2つのフィールドが0
であるレコードがあります。内部状態はどこに保存しますか?
どうすればこの問題を解決できますか?どこで内部状態を維持しますか?引数として0
を入力し、それらのフィールドには触れないようにユーザーに依頼してください。
レコードが初期化され、内部関数によってのみ更新されるときに、2つのフィールドが0
であるレコードがあります。内部状態はどこに保存しますか?
どうすればこの問題を解決できますか?どこで内部状態を維持しますか?引数として0
を入力し、それらのフィールドには触れないようにユーザーに依頼してください。
モジュールのタイプと機能を制限するには、モジュールの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 }
あなたは「ゲッター」と「セッター」を公開したい場合フィールドの場合は、次のようにすることができます。
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 }
レコードにジェネリックタイプのフィールドをどのように追加しますか?例えば'Dict Int valueType'? –
'type Model = Model(InternalModel a)'と 'type alias InternalModel a = {foo:Int、bar:a}'は型パラメータを渡します。 –
確かに、その型の値を渡さずに 'newModel'関数にどのように渡しますか? –
'' 'foldp'''があなたの探しているものかもしれません。また、 '' mergeMany'''は、複数のイベントソースを1つのイベントソースに結合して、内部状態を表す動作を生成することができます。私はいくつかのリンクを提供したいが、ドキュメンテーションサイトは現時点で私のために読み込まれていません。 – clinux
@clinux私はElmの最新バージョンを使用しています。 'foldp'はまだ0.17の後にありますか?また、どのように役立つか分かりません。 –
@FilipHaglund、 'foldp'と' mergeMany'は質問とは関係ありません。 @clinuxが何を得ているのか分かりません。 –