ここに私の問題の簡略化されたバージョンです:各連続した値が前のものに依存するランダムな値のリストを生成します。変換リスト(ジェネレータa)をジェネレータ(リストa)
たとえば、ランダムなリストInt
を生成します。このリストでは、連続する各値が次のステップの最小値を設定します。
-
まずステップ:のは
- 次へ=> 4
Random.int 3 8
- 次へ=> 8
Random.int 4 9
- 等
value = 0
と最大値を起動は常に
currentValue + 5
であると仮定する
Random.int 0 5
=> 3
私のアプローチは次のとおりです。
intGen : Int -> List (Rnd.Generator Int) -> List (Rnd.Generator Int)
intGen value list =
if length list == 10 then
list
else
let newValue = Rnd.int value (value + 5)
newList = newValue :: list
in intGen newValue newList
のはRnd.Generator (List Int)
に変換してみましょう:(Rnd.list 0 (Rnd.int 0 1))
:私はこの部分を好きではない
listToGen : List (Rnd.Generator Int) -> Rnd.Generator (List Int)
listToGen list =
foldr
(Rnd.map2 (::))
(Rnd.list 0 (Rnd.int 0 1))
list
。 Rnd.Generator (List Int)
の初期値を生成します。(Rnd.int 0 1)
は実際には使用されませんが、型チェックでは必要です。私は何とかこの部分をスキップするか、より一般的なものに置き換えたいと思います。それが可能か、私の実装は間違っていますか?
私は同様のことを考えていました。さらに、 'random-extra'パッケージには' List(Generator a) - > Generator(List a) '関数もありますので、コミュニティパッケージを知っておくと良いでしょう。ありがとう! – mmalik