2017-11-25 11 views
0

私はどのように私は今、それからリストを取得することができGeneratorエルムジェネレータのInt - >リストのInt

intList : Generator (List Int) 
intList = 
    list 5 (int 0 100) 

のうち、Listを取得したいですか?

+1

5つの乱数のリストを返す関数は純粋ではないため、できません。あなたが達成したいことについてもっと詳しく言うことができますし、慣用的なアプローチを見つけるのを助けることができます –

答えて

4

Elm関数は常に純粋なので、Generatorからランダムリストを取得することはできません。リストを取得する唯一の可能性は、コマンドを使用することです。

コマンドは、不正な操作を実行するようにElmランタイムに指示する方法です。あなたの場合、整数のランダムなリストを生成するように指示できます。次に、その操作の結果をupdate関数の引数として返します。あなたが機能a -> msgを提供する必要があるので、あなたはすでに、Generator a(あなたintList)を持っている

generate : (a -> msg) -> Generator a -> Cmd msg 

:あなたが機能Random.generateを使用することができ、ランダムな値を生成するには、コマンドを実行時エルムを送信するために

。この関数はa(あなたの場合はList Int)をというメッセージにラップする必要があります。

type Msg = 
    RandomListMsg (List Int) 
    | ... other types of messages here 

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = case msg of 
    ... -> (model, Random.generate RandomListMsg intList) 
    RandomListMsg yourRandomList -> ... 

あなたはまだおよそメッセージモデルがわからない場合、あなたはおそらくElm architecture最初に慣れる必要があります。

最終的なコードは、そのようなものでなければなりません。

+0

このように解決されました。しかし、なぜリストを返す 'Random.generate intList'を実行できなかったのか分かりません。これが' pure関数 'の概念をどのように破るのでしょうか? –

+1

@MihkelL。純関数は常に同じ値を返す必要があります。あなたの関数は毎回異なるリストを返すので、純粋ではありません。 – ZhekaKozlov

2

Random.stepに独自のシード値を指定すると、リストと次のシード値を含むタプルが返されます。同じシードを渡すと常に同じ結果が得られるため、これは純度を保持します。

Random.step intList (Random.initialSeed 123) 
    |> Tuple.first 

-- will always yield [69,0,6,93,2] 

@ZhekaKozlovによって与えられた答えは、アプリケーション内のランダムな値を生成する方法、一般的であるが、それは初期シードとして使用される現在時刻とボンネットの下にRandom.stepを使用しています。

+0

私はこの例が私の実際の質問によく答えると思います。しかし、もう一つの答えは "ベストプラクティス"を示しているかもしれません。この回答をありがとう;) –

関連する問題