Haskell:Turtle:从Shell中获取返回值

时间:2017-08-27 17:02:23

标签: haskell haskell-turtle

如何从Shell monad中提取值?

我想对àla bash的&&命令列表进行排序,但我还要提取最终的ExitCode值。

说我有以下代码:

import           Turtle

type Commands = [Shell ExitCode]
run :: (MonadIO io) => Commands -> io ExitCode
run cs = whatIsThisFunction $ Prelude.foldl (.&&.) (return ExitSuccess) cs

whatIsThisFunction :: (MonadIO io) => Shell a -> io a
whatIsThisFunction = undefined

我试图看看是否可以使用Control.Foldl实现此功能,但未找到解决方案。

有什么想法吗?

更一般地说,为什么Turtle不提供具有这种签名的功能:

sh' :: MonadIO io => Shell a -> io a 

2 个答案:

答案 0 :(得分:5)

Turtle.Shell为您提供了fold :: MonadIO io => Shell a -> Fold a b -> io bControl.Foldl为您提供了一大堆Fold,其中包括:last :: Fold a (Maybe a)。您可以将两者结合起来提取您的命令返回的最后ExitCode,如下所示:

import Control.Monad.IO.Class
import Turtle.Shell  as TS
import Control.Foldl as CF

sh' :: MonadIO io => Shell a -> io (Maybe a)
sh' c = TS.fold c CF.last

答案 1 :(得分:3)

sh' :: MonadIO io => Shell a -> io a是不可能的,因为Shell a可能来自[a](由select :: [a] -> Shell a证明)可能为空。