2016-10-16 9 views
0

レコードが初期化され、内部関数によってのみ更新されるときに、2つのフィールドが0であるレコードがあります。内部状態はどこに保存しますか?

どうすればこの問題を解決できますか?どこで内部状態を維持しますか?引数として0を入力し、それらのフィールドには触れないようにユーザーに依頼してください。

+0

'' 'foldp'''があなたの探しているものかもしれません。また、 '' mergeMany'''は、複数のイベントソースを1つのイベントソースに結合して、内部状態を表す動作を生成することができます。私はいくつかのリンクを提供したいが、ドキュメンテーションサイトは現時点で私のために読み込まれていません。 – clinux

+0

@clinux私はElmの最新バージョンを使用しています。 'foldp'はまだ0.17の後にありますか?また、どのように役立つか分かりません。 –

+0

@FilipHaglund、 'foldp'と' mergeMany'は質問とは関係ありません。 @clinuxが何を得ているのか分かりません。 –

答えて

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 } 

あなたは「ゲッター」と「セッター」を公開したい場合フィールドの場合は、次のようにすることができます。

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 } 
+0

レコードにジェネリックタイプのフィールドをどのように追加しますか?例えば'Dict Int valueType'? –

+0

'type Model = Model(InternalModel a)'と 'type alias InternalModel a = {foo:Int、bar:a}'は型パラメータを渡します。 –

+0

確かに、その型の値を渡さずに 'newModel'関数にどのように渡しますか? –

関連する問題