2012-12-28 81 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

相關問題