私はどのように私は今、それからリストを取得することができGenerator
エルムジェネレータのInt - >リストのInt
intList : Generator (List Int)
intList =
list 5 (int 0 100)
のうち、List
を取得したいですか?
私はどのように私は今、それからリストを取得することができGenerator
エルムジェネレータのInt - >リストのInt
intList : Generator (List Int)
intList =
list 5 (int 0 100)
のうち、List
を取得したいですか?
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最初に慣れる必要があります。
最終的なコードは、そのようなものでなければなりません。
このように解決されました。しかし、なぜリストを返す 'Random.generate intList'を実行できなかったのか分かりません。これが' pure関数 'の概念をどのように破るのでしょうか? –
@MihkelL。純関数は常に同じ値を返す必要があります。あなたの関数は毎回異なるリストを返すので、純粋ではありません。 – ZhekaKozlov
Random.step
に独自のシード値を指定すると、リストと次のシード値を含むタプルが返されます。同じシードを渡すと常に同じ結果が得られるため、これは純度を保持します。
Random.step intList (Random.initialSeed 123)
|> Tuple.first
-- will always yield [69,0,6,93,2]
@ZhekaKozlovによって与えられた答えは、アプリケーション内のランダムな値を生成する方法、一般的であるが、それは初期シードとして使用される現在時刻とボンネットの下にRandom.step
を使用しています。
私はこの例が私の実際の質問によく答えると思います。しかし、もう一つの答えは "ベストプラクティス"を示しているかもしれません。この回答をありがとう;) –
5つの乱数のリストを返す関数は純粋ではないため、できません。あなたが達成したいことについてもっと詳しく言うことができますし、慣用的なアプローチを見つけるのを助けることができます –