Структурирование динамического списка виджетов / событий 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])
и вы должны быть в состоянии mapDyn
leftmost
над ним.
Это не самое элегантное решение, но это лучшее, что я смог найти, когда попробовал нечто подобное. Я уверен, что это может быть извлечено в некоторую вспомогательную функцию.
Обратите внимание, что у меня нет компилятора, и проверка типов в моей голове довольно сложна, поэтому, если он не работает, напишите комментарий. Я посмотрю, когда буду дома с компилятором.