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

2023-11-30

我正在寻找一种方法来删除returns 来自以下函数:

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

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

我想我可以按照以下方式定义一个运算符

  a |>= b = (return a) >>= b

and get

  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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有 (return a) >>= b 的标准 Haskell 函数? 的相关文章

随机推荐