2014-08-31 43 views
4

有了:斯科蒂柱式不會允許效果

mailHandler = do 
    name <- param "name" 
    email <- param "email" 
    renderSendMail $ forwardMail name email 

main = scotty 3000 $ post "/mail" mailHandler 

我獲得下列類型的錯誤:

Couldn't match type `IO' 
        with `Web.Scotty.Internal.Types.ActionT T.Text IO' 
    Expected type: Web.Scotty.Internal.Types.ActionT T.Text IO() 
     Actual type: IO() 
    In a stmt of a 'do' block: renderSendMail $ forwardMail name email 
    In the expression: 
     do { name <- param "name"; 
      email <- param "email"; 
      renderSendMail $ forwardMail name email } 
    In an equation for `mailHandler': 
     mailHandler 
      = do { name <- param "name"; 
       email <- param "email"; 
       renderSendMail $ forwardMail name email } 
Failed to install server-0.0.1 
cabal: Error: some packages failed to install: 
server-0.0.1 failed during the building phase. The exception was: 
ExitFailure 1 

花費幾個小時後,我還沒有看到如何解決這個問題。如果我使用Scotty內部的函數,沒有問題,但如果我想從外部處理任何事情,我會得到上面的錯誤。我怎樣才能突破這個Web.Scotty.Internal.Types.ActionT T.Text IO()

回答

10

Web.Scotty.Internal.Types.ActionT T.Text IO()單子轉換超過IO。這些通常實施MonadIO類,這樣就可以使用liftIO功能(從Control.Monad.IO.Class,如果它沒有被已經導入),以「提升」 IO動作融入其中:

liftIO . renderSendMail $ forwardMail name email 
+0

OK,這就是有趣的 – Fresheyeball 2014-08-31 04:22:30

+0

如果您不介意,請告訴我要安裝''Control.Monad.IO.Class'的cabal軟件包的名稱。如果你能解釋這整個monad變壓器概念 – Fresheyeball 2014-08-31 04:23:26

+0

ok,那麼更好,我已經安裝了變壓器,事情又重新開始了,但是仍然會喜歡這個概念的解釋。 – Fresheyeball 2014-08-31 04:25:24