2012-12-28 69 views
2

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

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

能编辑您的代码段请在这里有正确的缩进/空格? – Windle

+0

当然,我会再给它一次,但链接的要点是正确的。 – rortian

回答

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" 
+0

感谢您的回答!过了一段时间,因为我已经玩过了代码,但在阅读完这些代码后我会再试一次。 – rortian

相关问题