2012-12-28 2 views
2

JSod 배열이 두 배인 텍스트 필드 인 Customod 필드를 Yesod에 만들고 싶습니다. 그러나 나는 타입 에러를 계속 얻는다. 나의 현재의 시도는 다음과 같습니다Yesod 사용자 정의 필드 유형 [Double]

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