3
필자는 WAI를 사용하여 간단한 피보나치 웹 서버를 작성하려고하지만 유형을 파악할 수 없습니다. 이 코드는 내가하고 싶은 것의 본질이지만 깨졌습니다. getQueryArg
함수는 Maybe ByteString
을 반환하며이 함수를 내 fibHandler
함수에 사용하려고합니다.피보나치 웹 서비스 (WAI 포함)
- 에
Maybe
을 올바르게 처리하려면 어떻게해야합니까? - 어쩌면 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
값으로 할 수
어떤 방법으로이 고장? 당신은 당신이 그것을 향상시킬 방법을 언급했다. (아마도 "아마도"..). 현재 코드에서 무엇이 손상되었는지는 언급하지 않았다 ... – sarnold
그냥 참고 :'fib n = foldl (*) 1 [1..n] '는 계승이며 피보나치 수는 아니다. –
@sarnold'getQueryArg'에서 처리하지 않았기 때문에 깨졌습니다. @ 대니얼 피셔 예, 당신은 완전히 맞습니다, 감사합니다! – Sam