2

我想在 Yesod 中创建一个自定义字段,它是一个带有双精度 JSON 数组的文本字段。但是我不断收到类型错误。我目前的尝试是:

    doubleListField :: RenderMessage master FormMessage => Field sub master [Double]
    doubleListField = Field
        { fieldParse = parseHelper $ Right . decodeUtf8 . parse json

        , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
        $newline never
    <input id="#{theId}" name="#{name}" *{attrs} type="number" :isReq:required="" value="Hey">
    |]
         }   

(找到正确的空格:https ://gist.github.com/4394850 )

我目前失败了:

        Couldn't match expected type `Data.ByteString.Internal.ByteString'
            with actual type `[Text]
                              -> m0 (Either (SomeMessage master0) (Maybe Text))'
In the second argument of `($)', namely `parseHelper $ Right'
In the `fieldParse' field of a record
In the expression:
  Field
    {fieldParse = parse json $ parseHelper $ Right,
     fieldView = \ theId name attrs val isReq
                   -> toWidget (\ _render_a5Cg -> ...)}

fieldView 我会修改,我知道该怎么做,但我对 fieldParse 的外观感到困惑。谢谢!

4

1 回答 1

0

请注意,您的代码与错误不匹配。

fieldParse函数应该将用户提交的数据转换为 Haskell 结构。正如您所发现的,有一个parseHelper函数可以简化字段的创建。

的类型parseHelper本质上是(Text -> Either FormMessage a) -> X,其中X的确切类型是fieldParse。也就是说,一旦你将一个参数传递给助手,你就会得到一个正确的fieldParse.

to 的参数parseHelper应该是一个函数,它接收Text输入并返回Right [Double]或者Left FormMessage如果解析失败。

根据您用于解析 JSON 的内容,该函数可能如下所示(假设存在您很可能需要编写的更多帮助程序):

fieldParse = parseHelper $ \text -> case parse json text of
    Right value | isListOfDoubles value -> Right $ extractListOfDoubles value
    _ -> Left "Wrong input"
于 2013-08-06T18:07:19.033 回答