【发布时间】:2015-06-04 16:29:18
【问题描述】:
我正在尝试找出在 Halogen 组件包含的 monad 上使用转换器的方式。
我想通过带有 Config 记录的 ReaderT 扩展 intro example,在这种情况下可用于使字符串可配置,但在将它们放在一起时我迷失了。
假设我们这样定义我们的配置:
-- | Global configuration
newtype Config = Config { toggleText :: String
, onText :: String
, offText :: String
}
然后我们的ui 函数将从
forall m eff. (Monad m) => Component m Input Input
到
forall m (Monad m) => Component (ReaderT Config m) Input Input.
为了评估我们的 main 函数,我们将使用 hoistComponent 将其变回原来的形式:
main = do
let config = Config { toggleText: "Toggle Button"
, onText: "On"
, offText: "Off"
}
Tuple node _ <- runUI $ hoistComponent (runReaderT config) ui
appendToBody node
到目前为止,我不确定这是否有意义,但假装它有意义,下一步就是我正在努力的地方。在理想的世界中,我的 ui 函数可以让我做这样的事情:
ui :: forall m eff. (Monad m) => Component (ReaderT Config m) Input Input
ui = render <$> stateful (State { on: false }) update
where
render :: State -> H.HTML (ReaderT Config m Input)
render (State s) = do
(Config conf) <- ask
return $ H.div_ [ H.h1_ [ H.text conf.toggleText ]
, H.button [ A.onClick (A.input_ ToggleState) ]
[ H.text (if s.on then conf.onText else conf.offText) ]
]
update :: State -> Input -> State
update (State s) ToggleState = State { on: not s.on }
但我最终遇到了一连串的统一错误,不知道从哪里开始。显然,ask 的内部使用不能像这样工作,因为我需要将它提升到 HTML 上下文中,但我什至不确定这是否可能。
如果有人可以指导我了解这里的类型并告诉我这种通用方法是否明智,那就太好了。一个完整(非编译)的例子是on GitHub。 I18n 应仅在此处用作阅读器的简单示例使用。
【问题讨论】:
标签: monad-transformers purescript halogen