Структурирование динамического списка виджетов / событий reflex-dom в соответствии с числовым вводом пользователя

Я пытаюсь создать динамический список виджетов с количеством виджетов, определяемым числовым значением из пользовательского ввода. Кроме того, каждый виджет возвращает событие щелчка. Вот что я использую, чтобы получить пользовательский ввод:

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 для каждого виджета. Эти виджеты возвращают 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,

1 ответ

Решение

Ваша проблема в том, что simpleList занимает Dynamic t [g] а также (Dynamic t g -> m a), Тем не менее, вы идете 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]) и вы должны быть в состоянии mapDynleftmost над ним.

Это не самое элегантное решение, но это лучшее, что я смог найти, когда попробовал нечто подобное. Я уверен, что это может быть извлечено в некоторую вспомогательную функцию.

Обратите внимание, что у меня нет компилятора, и проверка типов в моей голове довольно сложна, поэтому, если он не работает, напишите комментарий. Я посмотрю, когда буду дома с компилятором.

Другие вопросы по тегам