Я создаю способ отображения диалога для пользователей.
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)
Я могу использовать ScopedTypeVariables
и ввести конфигурацию по умолчанию в confirmDialog
как DialogConfig t m a b
, и это работает, однако разве это не должно работать даже без него? Мне кажется, что типы достаточно однозначны.