gpt4 book ai didi

haskell - 添加操作而不更改结果以重构 do-notation

转载 作者:行者123 更新时间:2023-12-04 10:36:10 25 4
gpt4 key购买 nike

我想在 Haskell 中按顺序组合两个 monad Action ,丢弃第二个产生的任何值,并将参数传递给这两个 Action 。目前我正在使用这样的do-block:

ask = do
result <- getLine
putStrLn result
return result

我希望写这个更自由和整洁,所以我尝试了这个:
ask' = getLine <* putStrLn

但是,这甚至没有类型检查,问题是 <* 不会将第一个 Action 的结果传递给第二个 Action 。我想链接 >>= 之类的操作会,但不会改变结果。类型应为 (a -> m b) -> (a -> m c) -> (a -> m b) , 但是 Hoogle不会产生合适的结果。实现此功能组合的运算符是什么?

最佳答案

作为一种趋势,如果您在两个不同的地方使用一个值,最好用明确的 do 给它命名。 block ,而不是按毫无意义的风格。

cartesian monoidal categories 捕获了将信息流拆分为不同 Action 的抽象概念。 ,Haskellers 称为 arrows .在您的情况下,您基本上是在 IO 中工作。克莱斯利类别:

import Prelude hiding (id)
import Control.Arrow

ask' :: Kleisli IO () String
ask' = Kleisli (\()->getLine) >>> (putStrLn &&& id) >>> arr snd

我认为编写这样的代码不是一个好主意。

关于haskell - 添加操作而不更改结果以重构 do-notation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34162101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com