我发现自己在写这个:
and_then :: x -> Maybe [x] -> Maybe [x]
x `and_then` mxs = do
xs <- mxs
return (x:xs)
Run Code Online (Sandbox Code Playgroud)
是否有一些更简单的方法来实现同样的事情?
基本上这是处理列表的标准递归循环 - 除了处理可能失败(这与结果只是一个空列表不同).这意味着我通常写的地方
z : process xs ys
Run Code Online (Sandbox Code Playgroud)
我现在要写
z `and_then` process xs ys
Run Code Online (Sandbox Code Playgroud)
由于这是一个相当普遍的习语,我想知道一些预先存在的功能是否可以帮助我.(几个Hoogle搜索未能找到类似于上述类型的任何函数.)
J. *_*son 11
由于你的do符号只是调用Maybe图层,我们可能会认为(:)操作独立于Maybe效果 - 它只是传递给包含的值的另一个函数Maybe.这导致我们稍微概括了代码
foo :: (x -> b -> b) -> x -> Maybe b -> Maybe b
foo f x m = do
b <- m
return (f x b)
Run Code Online (Sandbox Code Playgroud)
这使我们更清楚地知道我们只是处理一个问题 fmap
fmap fx m = do b <- m
return (fx b)
Run Code Online (Sandbox Code Playgroud)
因此,编写所需功能的最标准方法可能是
(z:) <$> process xs ys
Run Code Online (Sandbox Code Playgroud)