2012-07-18 3 views
3

필자는 WAI를 사용하여 간단한 피보나치 웹 서버를 작성하려고하지만 유형을 파악할 수 없습니다. 이 코드는 내가하고 싶은 것의 본질이지만 깨졌습니다. getQueryArg 함수는 Maybe ByteString을 반환하며이 함수를 내 fibHandler 함수에 사용하려고합니다.피보나치 웹 서비스 (WAI 포함)

  1. Maybe을 올바르게 처리하려면 어떻게해야합니까?
  2. 어쩌면 putStrLn을 호출 할 수 있습니까? 나는 fmap을 시험하고있다. 그러나 나는 그것을 올바르게 얻는 것처럼 보일 수 없다.

 

{-# LANGUAGE OverloadedStrings #-} 
import Network.Wai 
import Network.HTTP.Types 
import Network.Wai.Handler.Warp (run) 
import Data.ByteString.Lazy.Char8() -- Just for an orphan instance 
import Control.Monad.IO.Class (liftIO) 
import Data.Conduit 
import Data.String.Utils 
import Data.ByteString as BS (ByteString, putStrLn) 
import Data.ByteString.Char8 as B (unpack) 
import Data.Text as T (intercalate, pack, unpack) 

app :: Application 
app req 
    | rawPathInfo req == "/fib" = fibHandler req 
    | otherwise = notFoundHandler 

fibHandler :: Request -> ResourceT IO Response 
fibHandler req = do 
    let nStr = getQueryArg (queryString req) "n" 
    fmap (liftIO . BS.putStrLn) n 
    let n = read nStr 
    return $ responseLBS 
     status200 
     [("Content-Type", "text/plain")] 
     (show $ fib n) 

fib :: Int -> Int 
fib n = foldl (*) 1 [1..n] 

getQueryArg :: Query -> BS.ByteString -> Maybe BS.ByteString 
getQueryArg [] key = Nothing 
getQueryArg ((k,v):qs) key 
    | k == key = Just v 
    | otherwise = getQueryArg qs key 

notFoundHandler :: ResourceT IO Response 
notFoundHandler = return $ responseLBS 
    status404 
    [("Content-Type", "text/plain")] 
    "Not found" 

main :: IO() 
main = do 
    BS.putStrLn $ "http://localhost:8080/" 
    run 8080 $ app 

[업데이트 :이 코드의 작업 복사본은 여기에 있습니다 : https://gist.github.com/3145317] case를 사용하는 Maybe 값으로 할 수

+0

어떤 방법으로이 고장? 당신은 당신이 그것을 향상시킬 방법을 언급했다. (아마도 "아마도"..). 현재 코드에서 무엇이 손상되었는지는 언급하지 않았다 ... – sarnold

+0

그냥 참고 :'fib n = foldl (*) 1 [1..n] '는 계승이며 피보나치 수는 아니다. –

+1

@sarnold'getQueryArg'에서 처리하지 않았기 때문에 깨졌습니다. @ 대니얼 피셔 예, 당신은 완전히 맞습니다, 감사합니다! – Sam

답변

6

간단한 일입니다. 이 몇 수십 번 수행하면

case getQueryArg foo bar of 
    Nothing -> {- something went wrong, write some code to report an error -} 
    Just x -> {- everything went okay, and x is the result of the successful computation -} 

, 당신은 속기 버전으로 전환 할 수 있습니다 :

maybe ({- went wrong -}) (\x -> {- successful x -}) (getQueryArg foo bar) 
fromMaybe {- default value -} (getQueryArg foo bar) 
traverse_ B.putStrLn (getQueryArg foo bar) -- this trick is a personal favorite