5

ユーザー入力の数値によって決定されるウィジェットの数を使用して、ウィジェットの動的リストを作成しようとしています。さらに、各ウィジェットはクリック イベントを返します。ユーザー入力を取得するために使用しているものは次のとおりです。

settings :: MonadWidget t m => m (Dynamic t (Maybe Int))

次に、これを使用して乱数ジェネレーターのリストを生成します (これらが の値であるという事実は重要でRandomGenはありません。要素の数ではなく、各要素の内容に使用されるだけです)。

split' :: RandomGen g => Int -> g -> [g]
-- ...

gs <- mapDyn (maybe (split' 1 g) (flip split' g)) =<< settings

今私は持っていgs :: (MonadWidget t m, RandomGen g) => Dynamic t [g]ます。gウィジェットごとに1 つ。これらのウィジェットEventは値を返すので、それらを組み合わせて (つまりleftmost)、その値をfoldDynどこかで使用する必要があります。

go :: (MonadWidget t m, Random g) => g -> m (Event t MyType)
-- ...

clicked <- el "div" $ do
  -- omg
  xs <- simpleList gs go

  -- would like to eventually do this
  dynEvent <- mapDyn leftmost xs
  return $ switch (current dynEvent)

しかし、これまでのところ、私はxs :: Dynamic t [Dynamic t (m (Event t MyType))].

私が本当に必要としているのは、xs :: MonadWidget t m => Dynamic t [Event t MyType]代わりに何らかの方法で作成することだと思いますが、simpleList.

4

1 に答える 1

3

あなたの問題は、 simpleList が and を取ることDynamic t [g]です(Dynamic t g -> m a)。ただし、go は g -> m (Event t MyType) です。したがって、より良い方法を作成する必要があります。

go2 :: (MonadWidget t m, RandomGen g) => Dynamic t g -> m (Event t MyType)
go2 gDyn = do
    mapped <- mapDyn go gDyn
    dyned <- dyn mapped
    held <- hold never dyned
    return (switch held)

simpleList gs go2これを取得すると、戻ってくるので簡単になり、それを乗り越えることm (Dynamic t [Event t MyType])ができるはずです.mapDyn leftmost

これは最も洗練された解決策ではありませんが、似たようなことを試したときに見つけた最高のものです。いくつかのヘルパー関数に抽出できると確信しています。

私はコンパイラを持っていないことに注意してください。これを頭の中で型チェックするのは非常に難しいので、うまくいかない場合はコメントを書いてください。コンパイラを持って家に帰ったら見てみます。

于 2016-04-08T11:12:04.857 に答える