Есть ли функция черепахи или другая абстракция Haskell для объединения команд с помощью. && - PullRequest
1 голос
/ 05 ноября 2019

У меня есть следующий фрагмент кода:

foldM (\exitCode args -> pure exitCode .&&. someCmdWith args) ExitSuccess argss

В котором используется оператор turtle * (.&&.).

Есть ли лучшая абстракция, которую я мог бы использовать, чтобы применить .&&. к результатам применения someCmdWith к argss?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

(.&&.) выглядит ассоциативно, и кажется, что есть нейтральный элемент (pure ExitSuccess), поэтому давайте определим Monoid:

newtype UntilFailure = UntilFailure { runUntilFailure :: IO ExitCode }

instance Monoid UntilFailure where
     mappend (UntilFailure a1) (UntilFailure a2) =  UntilfFailure (a1 .&&. a2)
     mempty = UntilFailure (pure ExitSuccess)

Тогда мы можем написать что-то вроде:

runUntilFailure . foldMap UntilFailure $ someCmdWith <$> argss

Хорошая вещь в определении Monoid заключается в том, что нам не нужно запоминать, какой нейтральный элемент мы каждый раз сворачиваем в списке, так как он, так сказать, «запеченный в шрифте».

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

2 голосов
/ 05 ноября 2019

Будет ли это работать?

runCmds argss = foldr (.&&.) (pure ExitSuccess) (fmap someCmdWith argss)

Если вы хотите написать это еще короче, я считаю, что это также будет работать:

runCmds = foldr (.&&.) (pure ExitSuccess) . fmap someCmdWith
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...