MonadWidget如何适合WidgetFor?

时间:2019-06-30 09:15:29

标签: haskell yesod

在Yesod中有

defaultLayout :: WidgetFor site () -> HandlerFor site Html

setTitle :: MonadWidget m => Html => m ()

WidgetFor site的实例为MonadWidget。但是为什么defaultLayout $ setTitle "..."会编译?

setTitle "..." :: MonadWidget m => m ()的计算结果为 any MonadWidget m(例如MaybeT m也具有MonadWidget的实例)。

我在这里想念什么?

1 个答案:

答案 0 :(得分:4)

setTitle :: MonadWidget m => Html -> m ()

在调用者和该函数的实现之间读取为以下合同

  • 呼叫者必须选择m
  • 呼叫者必须确保所选的m满足MonadWidget m约束
  • 呼叫者必须传递一个Html参数
  • 该函数将返回m ()类型的值

请注意,选择setTitle不是m。该函数是多态的(在OOP术语中为“通用”),并且可以在调用者选择的任何m上使用。

由于defaultLayout要求m = WidgetFor site,因此GHC推断在setTitle调用中要使用该monad。然后一切都输入检查。