gpt4 book ai didi

haskell - 将 runFormPost 小部件放入元组中

转载 作者:行者123 更新时间:2023-12-02 01:54:38 26 4
gpt4 key购买 nike

我想为 runFormPost 生成的小部件(Html 表单)提供一些上下文。我以为我可以简单地将结果与我的上下文和模式匹配到我的 Hamlet 中的元组中,但由于 Handler Monads 而变得具有挑战性。

我有一个具有以下类型签名的 Monadic 形式:

myForm :: ModelId -> Model -> Html -> MForm Handler (FormResult MyData, Widget)
myForm rid rec extra = do
-- whamlet code here

我在 forM 中呈现一系列表单,并使用我的 Hamlet 文件中的小部件列表。一切正常。

widgets <- forM rs' $ \(Entity rid rec) ->
runFormPost $ myForm rid rec

现在,我想向每个小部件添加一些数据并将其作为元组返回。对于这个简单的例子,假设我想添加一个字符串。我尝试了以下代码,但当我尝试在我的 Hamlet 文件中使用它时它没有编译(如果我不在我的 Hamlet 文件中使用 widgets 列表它会编译)

widgets <- forM rs' $ \(Entity rid rec) ->
return ("Test", runFormPost $ myForm rid rec)

在我的 Hamlet 文件中,我尝试了类似这样的操作(x 是我的字符串上下文):

$forall (x,((res,widget), enctype)) <- widgets
<div>
<form method=post action=@{HandlerR hId} enctype=#{enctype}>
^{widget}

我收到以下错误:

Couldn't match expected type `((t0, a1), a0)'
with actual type `Handler ((FormResult MyData, Widget), Enctype)'
Expected type: [(t1, ((t0, a1), a0))]
Actual type: [(t1,
Handler ((FormResult MyData, Widget), Enctype))]
In the second argument of `Data.Foldable.mapM_', namely `widgets'

到目前为止,我已经尝试在 forM 或 map 中使用 fmapliftM,但我不断收到类似的错误。我还尝试将 Handler 放入我的模式匹配中,这给了我一个错误,提示 Handler 不在范围内。

关于如何将一些附加信息附加到小部件并在我的 Hamlet 文件中重新使用它的任何想法?

谢谢!

最佳答案

问题是 runFormPost 产生的结果被包裹在一个 monad 中,在这种情况下是 Handler

widgets :: (String, Handler ((FormResult MyData, Widget), Enctype)

因此,您应该使用您最初定义的未包装版本小部件来添加您的附加信息。使用您的第一个版本的 widgets::((FormResult MyData, Widget), Enctype),然后您可以添加行

let widgetsWithInfo = map (\w -> ("test", w)) widgets

然后在您的 hamlet 文件中,您应该嵌入 widgetsWithInfo::(String, ((FormResult MyData, Widget), Enctype)

关于您的附加问题:您对 fmap 的意图对我来说似乎是正确的,但是(如果它不仅仅是一个错字)您的表达式被括号括起来是不正确的。您想要将 fmap 应用于 runFormPost $ myForm rid rec 的结果,因此您必须将该子表达式括在括号中:

fmap (\x -> ("Test", x)) (rumformPost $ myForm rid rec)

关于haskell - 将 runFormPost 小部件放入元组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com