gpt4 book ai didi

haskell - 是否可以在 yesod 中进行表单字段转换?

转载 作者:行者123 更新时间:2023-12-01 02:33:55 24 4
gpt4 key购买 nike

是否可以给 checkM 提供以下类型:

checkM :: RenderMessage master msg => 
(a -> GHandler sub master (Either msg b)) ->
Field sub master a -> Field sub master b

原因如下:

我有一个要求输入用户名的表单。使用 checkM,我立即在数据库中查找输入的用户是否存在:
userField = checkM userexists textField
userexists input = do
mbuser <- runDB $ getBy $ UniqueName input
return $ case mbuser of
Nothing -> Left ("This user does not exist!" :: Text)
(Just (Entity uid _)) -> Right input
-- I would like to write "return Right uid" above!

但是,我只能返回 input::Text,所以在表单接受用户输入后,我需要对同名进行另一个数据库查找,以获取该用户的数据库键,这正是我真正想要的。

(这个例子在很大程度上被简化了。本质上,我想获取一系列不同用户输入的数据库键(全部以一种形式),我只能作为 TextFields 询问,或者不是?)

最佳答案

类型签名看起来如此的原因是 Field 有两个方面。 : 如何解析它,以及如何渲染它。 checkM仅更改您解析字段的方式,但渲染函数 ( fieldView ) 保持不变。因此,该值需要保持相同的类型。

我能想到的获得您想要的行为的最简单方法是拥有一个函数,该函数可以从新类型的值中获取旧类型的值。这样,给定一个新值,我们就可以将该函数应用于它并获取旧值以进行渲染。下面是代码的样子:

checkM' :: RenderMessage master msg
=> (a -> GHandler sub master (Either msg b))
-> (b -> a)
-> Field sub master a
-> Field sub master b
checkM' f inv field = field
{ fieldParse = \ts -> do
e1 <- fieldParse field ts
case e1 of
Left msg -> return $ Left msg
Right Nothing -> return $ Right Nothing
Right (Just a) -> fmap (either (Left . SomeMessage) (Right . Just)) $ f a
, fieldView = \i n a eres req -> fieldView field i n a (fmap inv eres) req
}

因此,在您的情况下,您可以通过更改 userexists 中的最后一行来使用它。到:
(Just (Entity uid _)) -> Right (input, uid)

然后定义 userField作为
userField = checkM' userexists fst textField

我认为像 checkM 这样的函数包含在 yesod 形式中是有意义的,但希望有一个更好的名称;)。

关于haskell - 是否可以在 yesod 中进行表单字段转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11249832/

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