【问题标题】:Does this function already exist? (Maybe monad)这个功能是否已经存在? (也许是单子)
【发布时间】:2014-04-20 23:14:01
【问题描述】:

我发现自己在写这个:

and_then :: x -> Maybe [x] -> Maybe [x]
x `and_then` mxs = do
  xs <- mxs
  return (x:xs)

有没有更简单的方法来达到同样的目的?

基本上,这是处理列表的标准递归循环 - 除了处理可能失败(这与结果只是一个空列表不同)。这意味着我通常会写的地方

z : process xs ys

我现在要写了

z `and_then` process xs ys

由于这是一个相当常见的习语,我想知道是否有一些预先存在的功能可以帮助我。 (Hoogle 多次搜索都找不到与上述类型相似的任何函数。)

【问题讨论】:

  • fmap (x:) mxs 怎么样?
  • 当然,Hoogle 只会告诉你一个函数是否有你想要的类型。它无法告诉您库函数的组合 是否可以完成这项工作... 建议将此作为一项新功能听起来很诱人,但我担心没有办法确切说明是什么代码用户想要一半的时间......

标签: haskell monads


【解决方案1】:

由于您的do 表示法仅调用Maybe 层,我们可能会认为(:) 操作独立于Maybe 的效果——它只是另一个传递给包裹的值的函数Maybe。这导致我们稍微概括一下代码

foo :: (x -> b -> b) -> x -> Maybe b -> Maybe b
foo f x m = do
  b <- m
  return (f x b)

这更清楚地表明我们只是在处理fmap

fmap fx m = do b <- m
               return (fx b)

因此,编写所需函数的最标准方式可能是

(z:) <$> process xs ys

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2013-08-24
    • 2011-11-23
    • 1970-01-01
    • 2021-10-18
    • 2022-08-19
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多