1

我正在为我的基于 Yesod 的站点编写一个 CRUD 界面,但我遇到了一些值的问题。特别是,我正在尝试对以下值进行 CRUD:

data Value = Value { valueId :: UUID
                   , otherStuff :: Stuff
                   }

我很难找到一种使用 Yesod 和 Aeson 提供的工具来创建其中一个的好方法。在遥远的过去,当我使用 formlets 时,我会使用表单的 monad 转换器版本来执行以下操作:

Value <$> (liftIO getUUID)
      <*> textField Nothing

(我可能没有完全正确地理解formlets 语法,但希望那里的Haskellers 能理解要点)。这会产生一个不包含 UUID 字段的表单和一个运行 IO 操作以在后期生成数据的表单解析器的效果。

我不确定如何进行。我考虑了与 Aeson 解析相同的想法,但 attoparsec(底层解析器)也不是单子转换器。

除了具有中间数据表示之外,任何人都可以想到更多的选择吗?

4

1 回答 1

2

如果您要尝试以 Applicative 形式调用 IO 操作,则可以使用一个技巧:

lift (liftIO action)

问题是 Applicative 不能是 MonadIO 的实例,但它可以是 MonadTrans 的实例。

于 2013-09-22T04:24:35.730 回答