Yesod自定义字段类型[双]

时间:2012-12-28 19:19:21

标签: json forms field yesod

我想在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应该如何看起来感到困惑。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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"