在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
的实例)。
我在这里想念什么?
答案 0 :(得分:4)
setTitle :: MonadWidget m => Html -> m ()
在调用者和该函数的实现之间读取为以下合同
m
m
满足MonadWidget m
约束Html
参数m ()
类型的值请注意,选择setTitle
不是m
。该函数是多态的(在OOP术语中为“通用”),并且可以在调用者选择的任何m
上使用。
由于defaultLayout
要求m = WidgetFor site
,因此GHC推断在setTitle
调用中要使用该monad。然后一切都输入检查。