是否有使用 .&& 连接命令的海龟函数或其他 Haskell 抽象
Is there a turtle function or other Haskell abstraction for joining commands using .&&
我有如下一段代码:
foldM (\exitCode args -> pure exitCode .&&. someCmdWith args) ExitSuccess argss
我可以使用更好的抽象来将 .&&.
应用于将 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
。
我有如下一段代码:
foldM (\exitCode args -> pure exitCode .&&. someCmdWith args) ExitSuccess argss
我可以使用更好的抽象来将 .&&.
应用于将 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
。