2014-08-31 4 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 

Проведя несколько часов, я до сих пор не понимаю, как решить эту проблему. Если я использую функцию, внутреннюю для Скотти, не проблема, но если я хочу обработать что-либо извне, я получаю ошибку выше. Как я могу пройти мимо этого 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

нормально, вот интересный – Fresheyeball

+0

Если вы не прочь, пожалуйста, скажите мне имя пакета cabal для установки, чтобы получить 'Control.Monad.IO.Class'. И даже лучше, если вы сможете объяснить всю концепцию трансформатора монады – Fresheyeball

+0

, я установил «трансформаторы», и все ожило, но все равно понравится объяснение концепции. – Fresheyeball