【问题标题】:Scotty post type wont allow effectsScotty 帖子类型不允许效果
【发布时间】:2014-10-24 16:21:51
【问题描述】:

与:

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 ()

【问题讨论】:

    标签: haskell functional-programming scotty


    【解决方案1】:

    Web.Scotty.Internal.Types.ActionT T.Text IO ()IO 之上的monad 转换器。这些通常实现MonadIO 类,因此您可以使用liftIO 函数(来自Control.Monad.IO.Class,如果尚未导入)将IO 操作“提升”到它们中:

    liftIO . renderSendMail $ forwardMail name email
    

    【讨论】:

    • 如果您不介意,请告诉我要安装的 cabal 包的名称以获得Control.Monad.IO.Class。如果你能解释整个 monad 转换器的概念,那就更好了
    • 好的,我安装了transformers,一切又恢复了活力,但仍然希望对这个概念进行解释。
    • @Fresheyeball scotty 似乎已经依赖于transformers,所以我怀疑这是多余的? (因为scotty 自己定义了一个转换器,所以它必须这样做。)
    • @Fresheyeball Monad 变形金刚是一个有点大的主题,所以我想我会在这里继续解释它,但请参阅例如this Wikibook chapter.
    • @Fresheyeball 还有这篇论文:grabmueller.de/martin/www/pub/Transformers.pdf
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多