2013-07-18 2 views
0

Yesodod의 Paginator 패키지가 있다는 것을 알고 있지만 더 간단한 UI를 선호하여 앱의 간단한 페이지 매김 논리를 작성했습니다. 그러나 매개 변수 값을 Integer로 변환하는 방법을 찾을 수 없습니다. 나는 다음과 같은 오류 메시지가 위의 코드를 실행하면페이지 매김 : 매개 변수 값을 정수로 변환하는 중 오류가 발생했습니다.

import Data.Text (unpack, singleton) 
import Data.Maybe 

one = singleton '1' -- convert char to Text, required by fromMaybe 

getTestPanelR :: Handler Html 
getTestPanelR = do 
    ptext <- lookupGetParam "p" -- guessing returns Maybe Text 
    p <- fromMaybe one ptext -- ??? does not work 
    -- pn <- ??? Once p is extracted successfully, how to convert to an integer? 

    s <- runDB $ selectList [] [Asc PersonName, LimitTo 10 , OffsetBy $ (pn - 1) * 10] 
    (widget, enctype) <- generateFormPost $ entryForm Nothing 
    defaultLayout $ do 
     $(widgetFile "person") 

: 나는이 #{show ptext}를 사용하여 'ptext'를 쓰는 경우

No instance for (MonadHandler Maybe) 
    arising from a use of `lookupGetParam' 
Possible fix: add an instance declaration for (MonadHandler Maybe) 
In the second argument of `($)', namely `lookupGetParam "p"' 
In a stmt of a 'do' block: 
    p <- fromMaybe one $ lookupGetParam "p" 
In the expression: 
... 

그것은 Just "1"을 보여줍니다. GET 매개 변수를 얻은 후 페이지 매기기를 수행 할 수 있도록 정수로 변환하는 방법은 무엇입니까?

Prelude Data.Maybe Data.Text> let one = singleton '1' 
Prelude Data.Maybe Data.Text> let x = Just $ singleton '5' 
Prelude Data.Maybe Data.Text> let y = fromMaybe one x 
Prelude Data.Maybe Data.Text> y 
"5" 
Prelude Data.Maybe Data.Text> read $ Data.Text.unpack y ::Int -- This is probably unsafe because I cannot trust 'y' in my web app 
5 

업데이트 :

I를 내가이 사용 GHCi를하려고 할 때, 그것은 잘 작동

FWIW, ('다음'에 대한 1을 추가하고 '이전'에 대한 1을 뺄 필요) Ankur의 제안 pageNumber <- (lookupGetParam "p" >>= return . (read :: String -> Int) . fromMaybe "1") @ 피곤하고 나는 다음과 같은 오류 얻을 :

Couldn't match expected type `String' with actual type `Text' 
Expected type: Maybe Text -> String 
    Actual type: Maybe Text -> Text 
In the return type of a call of `fromMaybe' 
In the second argument of `(.)', namely `fromMaybe "1"' 
Build failure, pausing... 

를 "1"일 (Data.Text.singleton '1')에, 나는 여전히 GE를 변경하는 경우 정확한 오류 메시지.

감사합니다.

답변

1

lookupGetParamtype ParamValue = StringParamValue을 반환합니다. 기본적으로 Text가 아닌 String입니다.

이 시도 :

pageNumber <- (lookupGetParam "p" >>= return . (read :: String -> Int) . fromMaybe "1") 

UPDATE :

을 실제로 lookupGetParam의 최신 버전입니다 Text 때문에 작업을 완수해야 OverloadedStrings 언어 확장을 추가하는 기반 :

{-# LANGUAGE OverloadedStrings #-}를 넣어 코드 파일의 시작 부분에서 다음을 사용하십시오.

pageNumber <- (lookupGetParam "p" >>= return . (read :: String -> Int) . unpack . fromMaybe "1") 
+0

감사합니다. @ ankur. 위의 내 업데이트를 참조하십시오 - 나는 여전히 오류가 발생합니다. 사실 내가 실수로 "1"을 fromMaybe에 사용했을 때 전에이 오류 메시지가 나타납니다. 그 때 텍스트 경로를 따라 내려 갔지만 하스켈 지식이 부족하여 디버깅하기가 어려웠습니다. 당신의 제안에도 무엇이 잘못 될 수 있는지에 대한 생각이 있습니까? – Ecognium

+0

업데이트 된 답변을 확인하십시오 – Ankur

+0

Thanks @Ankur. 그게 효과가 있었어! – Ecognium

관련 문제