2

我正在使用 scotty 并且无论我尝试从 POST 请求执行 shell 脚本的任何方式,我都会遇到相同的类型错误。

main = scotty 3000 $ do    
  post "MyPage/ScriptTime/run" $ do
      aparameter <- param "aparameter"
      bparameter <- param "bparameter"
      cparameter <- param "cparameter"
      dparameter <- param "dparameter"
      eparameter <- param "eparameter"
      rawSystem "./shellscript.sh" [ "-a"
                                   , aparameter
                                   , "-b"
                                   , bparameter
                                   , "-c"
                                   , cparameter
                                   , dparameter
                                   , eparameter
                                   ]

使用关于是否可以从 haskell 程序调用 bash 或 shell 脚本的答案?在 Haskell中执行系统命令并没有帮助我更改错误消息。

错误内容如下:

Main.hs:68:5: error:
• Couldn't match type ‘IO’
                 with ‘Web.Scotty.Internal.Types.ActionT
                         Data.Text.Internal.Lazy.Text IO’
  Expected type: Web.Scotty.Internal.Types.ActionT
                   Data.Text.Internal.Lazy.Text IO ()
    Actual type: IO GHC.IO.Exception.ExitCode
• In a stmt of a 'do' block:
    rawSystem "./shellscript.sh" ["-a", aparameter, "-b", bparameter, ....]
  In the second argument of ‘($)’, namely
    ‘do aparameter <- param "aparameter"
        bparameter <- param "bparameter"
        cparameter <- param "cparameter"
        dparameter <- param "dparameter"
        ....’

我已经以多种方式更改了用于调用 shell 脚本的函数和库,包括:

() <- createProcess (proc "./shellscript.sh" ["-a", aparameter, "-b", bparameter, ...])

runProcess (shell "./shellscript.sh -a aparameter -b bparameter ...") >>= print

我尝试过使用 System.Process、System.Process.Typed 和 System.Cmd 库。

有人可以帮我理解我的类型不匹配。

4

1 回答 1

3

不匹配出现在函数运行的 monad 中。rawSystemIOmonad 中运行,如其 type所示,以及错误消息中。但是scotty'srun函数需要一个在ActionT e mmonad中运行的东西。

错误消息告诉您:无法将类型IO _ActionT Text IO _.

由于ActionT有一个实例MonadTrans,您可以只lift将一个IO函数放入ActionT _ IO

lift $ rawSystem "./shellscript.sh" [...]

完成此操作后,您的下一个问题将是返回类型:rawSystem返回一个ExitCode,而scotty' 的run函数需要单位。如果您可以丢弃退出代码(尽管我不推荐它),您可以将其绑定到一个未命名的变量:

_ <- lift $ rawSystem ...
pure ()

或者,更好的是,您可以使用void丢弃该值:

void . lift $ rawSystem ...
于 2019-12-05T16:58:37.300 回答