Я занимаюсь исследованием практических аспектов FRP для пользовательского интерфейса, и я изо всех сил пытался реализовать следующие функции с использованием реактивного банана: на основе значения поля выбора отображается переменное количество списков, которые отображают некоторые результаты. (Я использую WxHaskell.)
Было довольно просто реализовать это, используя набор готовых списков, которые скрываются и отображаются в зависимости от поведения результата, но на этот раз я хочу, чтобы он создавал и уничтожал списки по мере необходимости, каждый список был связан с поведением результатов.
Пока у меня есть следующие ингредиенты:
- событие
eParam
, привязанное к окну выбора - поведение
bResults :: Behavior t [[String]]
, определенное с помощьюeParam
(иstepper
), которое содержит все результаты (списки элементов в списке) - функция обновления
updateResultControls :: [SingleListBox ()] -> [[String]] -> IO [SingleListBox ()]
, которая уничтожает или создает списки на основе результатов. Обратите внимание, что возвращаемый тип находится в IO.
Глядя на пример BarTab , я попытался реализовать следующее:
- поведение
bResultControls :: Behavior t [SingleListBox ()]
со списками, определенное какstepper [] eUpdateResultControls
. - событие
eUpdateResultControls :: Event t [SingleListBox ()]
, которое выполняет обновление пользовательского интерфейса. Это событие зависит от вариантов поведенияbResultControls
иbResults
. Однако он также должен обновить сеть и запустить ввод-вывод, поэтому я подозреваю, чтоMoment
иexecute
будут задействованы. Здесь я застрял.
Моя последняя попытка такова:
rec
let
bResultControls = stepper [] eResultControls
bResultControlsUpdate = updateResultControls <$> bResultControls <*> bResults
eResultControls <- execute $ FrameworksMoment . liftIO <$> (bResultControlsUpdate <@ eParam)
Но я получаю следующую ошибку типа:
Couldn't match type `m0 [SingleListBox ()]'
with `forall t1. Frameworks t1 => Moment t1 [SingleListBox ()]'
Expected type: IO [SingleListBox ()]
-> forall t. Frameworks t => Moment t [SingleListBox ()]
Actual type: IO [SingleListBox ()] -> m0 [SingleListBox ()]
In the second argument of `(.)', namely `liftIO'
In the first argument of `(<$>)', namely
`FrameworksMoment . liftIO'
In the second argument of `($)', namely
`FrameworksMoment . liftIO <$> (bResultControlsUpdate <@ eParam)'
Я подозреваю, что это потребует обрезки некоторых моделей поведения, или, возможно, я делаю это совершенно неправильно.
t
, который вы можете рассматривать как время начала. Аргумент конструктораFrameworksMoment
должен быть полиморфным вt
, но в вашем примере это не так, поэтому вы получаете ошибку типа. Я бы порекомендовал более внимательно изучить примерBarTab
и понять, почему там присутствует типAnyMoment
, надеюсь, это поможет. Основная проблема заключается в том, что поведение списков начинается в разное время, и для отслеживания этого используется система типов. - person Heinrich Apfelmus   schedule 05.08.2014BarTab
и тем, что я пытаюсь сделать, заключается в том, что я хочу использовать существующее поведение для определения этих списков, которые, кажется, пропускаютt
, связанныйnetworkDescription
(то есть исходное время начала) вMoment
I Я пытаюсь определить дляexecute
(который в результате не может быть полиморфным. (Кстати, я пробовал с подписями типов.)) Может ли это быть так? (Мне не очень интересно создавать поведение на основе этих новых списков в этом примере, что и делаетBarTab
.) - person Jacob   schedule 06.08.2014