我正在构建一种向用户显示对话框的方法。
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))
我想使用某种“默认”实例来初始化DialogConfig
该dialog
函数,以便可以将其用作例如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)
我可以在as中使用ScopedTypeVariables
并键入默认配置,这样就可以了,但是即使没有它,它也不应该工作吗?在我看来,这些类型相当明确。confirmDialog
DialogConfig t m a b