我想在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应该如何看起来感到困惑。谢谢!
答案 0 :(得分:0)
请注意,您的代码与错误不符。
fieldParse
函数应该将用户提交的数据转换为Haskell结构。正如您所发现的,有一个parseHelper
函数可以简化字段的创建。
parseHelper
的类型基本上是(Text -> Either FormMessage a) -> X
,其中X
是fieldParse
的确切类型。也就是说,一旦将一个参数传递给帮助器,就会得到正确的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"