如何从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
答案 0 :(得分:5)
Turtle.Shell
为您提供了fold :: MonadIO io => Shell a -> Fold a b -> io b
,Control.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
证明)可能为空。