2013-06-27 37 views
4

我試圖用Happstack實現一個簡單的請求處理程序:結合GET和POST部分在Happstack路由過濾器

main :: IO() 
main = simpleHTTP nullConf app 

app :: ServerPart Response 
app = msum [ 
      dir "hello" $ method GET >> helloGet 
      , dir "hello" $ method POST >> helloPost 
      ] 

如何能夠做到不重複dir "hello"類似的東西?

app :: ServerPart Response 
app = msum [ 
      dir "hello" $ do 
       method GET >> helloGet 
       method POST >> helloPost 
      , okResponse home 
      ] 

只有將 「落空」 爲默認的一部分。

回答

2
app :: ServerPart Response 
app = msum [ 
      dir "hello" $ (method GET >> helloGet) <|> (method POST >> helloPost) 
      , okResponse home 
      ] 

..假設ServerPart有合適的Alternative實例。如果由於某種原因缺少,您可以用mplus代替(<|>)。這裏的主要想法是,你只是將一個路由組合器嵌套在另一個路由組合器中。

+0

好極了!謝謝。 – yesthisisuser

1

這是八九不離十已經:

app :: ServerPart Response 
app = msum [ 
      dir "hello" $ do 
       method GET >> helloGet 
       method POST >> helloPost 
      , okResponse home 
      ] 

你只需要一個額外的嵌套msum

app :: ServerPart Response 
app = msum [ 
      dir "hello" $ 
       msum [ method GET >> helloGet 
        , method POST >> helloPost 
        ] 
      , okResponse home 
      ] 

至於別人推薦你也可以使用<|>mplus或與Alternative其它功能, MonadPlus

  • 傑里米
+0

謝謝。現在這變得更加清晰了。我必須閱讀我的msum,mplus和朋友。 – yesthisisuser