私はUIの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 ()]
UI の更新を実行するイベント。bResultControls
このイベントは、動作とに依存しbResults
ます。ただし、ネットワークを更新して IO を実行する必要もあるため、関与する可能性があると思わ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)'
これにはいくつかの動作のトリミングが含まれると思われます。または、おそらくこれについて完全に間違った方法で行っていると思います。