5

你如何从 Shell monad 中提取一个值?

我想对命令列表进行排序à la bash's &&,但我也想提取最终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 
4

2 回答 2

5

Turtle.Shell为您提供 afold :: MonadIO io => Shell a -> Fold a b -> io bControl.Foldl为您提供一堆Folds 其中: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
于 2017-08-28T10:26:15.860 回答
3

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

于 2017-08-27T17:16:36.423 回答