是否有使用 .&& 连接命令的海龟函数或其他 Haskell 抽象

Is there a turtle function or other Haskell abstraction for joining commands using .&&

我有如下一段代码:

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

其中使用 turtle's (.&&.) 运算符。

我可以使用更好的抽象来将 .&&. 应用于将 someCmdWith 应用于 argss 的结果吗?

这行得通吗?

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

如果你想写的更短一点,我相信这样也行:

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

(.&&.) 看起来具有关联性并且似乎有一个中性元素 (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 的好处是我们不必在每次折叠项目列表时都记住哪个是中性元素,因为 "baked in the type",所以说话。

我不认为可以从 (.||.) 中定义一个幺半群,因为中性元素必须以某种方式保留前一个命令的退出代码。不过,仍然可以定义 Semigroup