gpt4 book ai didi

haskell - 是否有 (return a) >>= b 的标准 Haskell 函数?

转载 作者:行者123 更新时间:2023-12-03 06:23:14 25 4
gpt4 key购买 nike

我正在寻找一种方法来从以下函数中删除返回:

  naming path = 
getModificationTime path >>=
return . formatTime defaultTimeLocale "%Y%m%d" >>=
return . printf "%s_%s" (takeBaseName path) >>=
return . replaceBaseName path

我以这种方式构造它的原因是因为 >>= 本质上成为一种管道运算符,数据从一行流到下一行。

我想我可以按照

的方式定义一个运算符
  a |>= b = (return a) >>= b

并得到

  naming path = 
getModificationTime path >>=
formatTime defaultTimeLocale "%Y%m%d" |>=
printf "%s_%s" (takeBaseName path) |>=
replaceBaseName path

但我收到错误

Precedence parsing error
cannot mix `|>=' [infixl 9] and `.' [infixr 9] in the same infix expression

解决此问题的最佳方法是什么?更好的是,是否有某种标准运算符或其他方法可以更轻松地以这种方式构建代码?

最佳答案

大概您希望它的行为与 >>= 具有相同的固定性,因此如果您加载 GHCi 并输入

> :info (>>=)
...
infixl 1 >>=

然后您可以将运算符定义为

infixl 1 |>=
(|>=) :: Monad m => a -> (a -> m b) -> m b
a |>= b = return a >>= b

但是,如果您的 monad 保留了 monad 法则,则这与执行 b a 相同,因此一开始就不需要运算符。

我还建议使用 do 表示法:

naming path = do
modTime <- getModificationTime path
let str = formatTime defaultTimeLocale "%Y%m%d" modTime
name = printf "%s_%s" (takeBaseName path) str
replaceBaseName path name

关于haskell - 是否有 (return a) >>= b 的标准 Haskell 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203056/

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