Основной вопрос по выполнению нескольких команд в Haskell - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть следующее в моем коде:

  where
    launch :: MonadIO m => m (Maybe Text)
    launch = do
        line <- launchLine
        return $ lineToText <$> line

    launchLine :: MonadIO m => m (Maybe Line)
    launchLine = fold (inproc "juke" ["launch", "--profile", "jukeplay", pack baseImage] mempty) $
        Fold selectLaunchName Nothing id

Строки выше работают нормально.Моя проблема (и вопрос) в том, что я хочу выполнить еще одну команду до этой строки запуска, поэтому это может быть что-то вроде:

  where
    launch :: MonadIO m => m (Maybe Text)
    launch = do
        line <- launchLine
        return $ lineToText <$> line

    launchLine :: MonadIO m => m (Maybe Line)
    launchLine = fold (inproc "juke" ["image", "copy", "jukebox:" <> pack baseImage, "local:", "--copy-aliases"] mempty) $
        Fold selectLaunchName Nothing id

    launchLine :: MonadIO m => m (Maybe Line)
    launchLine = fold (inproc "juke" ["launch", "--profile", "jukeplay", pack baseImage] mempty) $
        Fold selectLaunchName Nothing id

Это, очевидно, не работает.Как я могу это сделать?

Мне нужно, чтобы эта "копия образа Juke" была сделана до того, как "запуск Juke запускается".

Заранее спасибо за помощь

1 Ответ

0 голосов
/ 15 декабря 2018

Вы можете комбинировать монадические действия с (>>):

(>>) :: Monad m => m a -> m b -> m b

или с синтаксисом do, который обнуляет (>>):

\act1 act2 -> do {act1; act2} :: Monad m => m a -> m b -> m b

Например:

launch :: MonadIO m => m (Maybe Text)
launch = do
    preLaunchLine
    line <- launchLine
    return $ lineToText <$> line

preLaunchLine :: MonadIO m => m (Maybe Line)
preLaunchLine = fold (inproc "juke" ["image", "copy", "jukebox:" <> pack baseImage, "local:", "--copy-aliases"] mempty) $
    Fold selectLaunchName Nothing id

launchLine :: MonadIO m => m (Maybe Line)
launchLine = fold (inproc "juke" ["launch", "--profile", "jukeplay", pack baseImage] mempty) $
    Fold selectLaunchName Nothing id
...