我正在为基于Yesod的网站编写CRUD界面,但我遇到了一些问题。特别是,我正在尝试对以下值进行CRUD:
data Value = Value { valueId :: UUID
, otherStuff :: Stuff
}
我很难找到使用Yesod和Aeson提供的工具创建其中一个的好方法。当我使用formlet时,在遥远的过去,我会使用monad变换器版本的表单来做一些事情:
Value <$> (liftIO getUUID)
<*> textField Nothing
(我可能没有得到完全正确的formlets语法,但希望Haskellers在那里获得要点)。这样做的结果是制作了一个不包含UUID字段的表单和一个运行IO操作以在后期制作数据的表单解析器。
我不知道该怎么办。我认为使用Aeson解析时也有同样的想法,但attoparsec(底层解析器)也不是monad转换器。
除了拥有中间数据表示之外,还有人能想到更多的选择吗?
答案 0 :(得分:2)
如果您要做的是在Applicative表单中调用IO操作,可以使用一个技巧:
lift (liftIO action)
问题是Applicative不能是MonadIO的实例,但它可以是MonadTrans的实例。