Haskell: Turtle: получить возвращаемое значение из Shell
Как извлечь значение из монады Shell?
Я хотел бы упорядочить список команд а-ля Баш &&
, но я также хотел бы извлечь финал 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 ответа
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
sh' :: MonadIO io => Shell a -> io a
невозможно, потому что Shell a
может быть построен из [a]
(подтверждается select :: [a] -> Shell a
) который может быть пустым.