私はユーザーにダイアログを表示する方法を構築しています。タイプ推論 - Monadを推論できませんでした
data DialogConfig t m b e =
DialogConfig { _dialogConfig_title :: Dynamic t T.Text
, _dialogConfig_content :: b -> m (Dynamic t (Maybe b))
, _dialogConfig_footer :: Dynamic t (Maybe b) -> m (Event t e)
}
dialog :: MonadWidget t m =>
DialogConfig t m b e -> Event t b -> m (Event t (DialogEvent e))
私は、例えばとしてそれを使用することができるように、dialog
機能のためDialogConfig
を初期化するために「デフォルト」のインスタンスのいくつかの種類を使用したいですdefaultConfig{_dialogConfig_content=content}
。しかし、私は型推測で戦っている。これは動作します:
confirmDialog :: forall t m. MonadWidget t m =>
T.Text -> Event t T.Text -> m (Event t())
...
evt <- dialog
(DialogConfig { _dialogConfig_title = constDyn title
, _dialogConfig_content = content
, _dialogConfig_footer = buttons}
) contentEvt
をしかし、私はいくつかのデフォルトを使用する場合DialogConfig
(例えばここではそれを直接インライン化)、それはしていません:
evt <- dialog
(DialogConfig { _dialogConfig_title = constDyn mempty
, _dialogConfig_content = const $ return $ constDyn Nothing
, _dialogConfig_footer = const $ return never }
{ _dialogConfig_title = constDyn title
, _dialogConfig_content = content
, _dialogConfig_footer = buttons}
) contentEvt
エラーは以下のとおりです。
Could not deduce (Reflex t0) arising from a use of ‘constDyn’ from the context (MonadWidget t m)
Could not deduce (Monad t1) arising from a use of ‘return’ from the context (MonadWidget t m)
I ScopedTypeVariables
を使用し、confirmDialog
のデフォルトの設定をDialogConfig t m a b
と入力すれば動作しますが、それがなくても動作しませんか?タイプはむしろあいまいではないようです。
[reflex-dom-contrib](https://github.com/reflex-frp/reflex-dom-contrib/blob/master/src/)には非常に良い(まだ実験的ですが)モーダルダイアログの形式があります – user2847643
私たちは当面自分で実装することを決めました... – ondra
エラーはおそらく、以前のレコード更新の値が使用されていないという事実のためです。自然にあいまいである。本質的な問題は、レコードの更新がレコードのタイプを変更できるということです。必要な型推論を取得するには、型を変更しない方法でレコード(レンズなど)を更新する方法を定義する必要があります。 – user2407038