在特定情况下如何使用高阶结构

迈克尔·恢复莫妮卡·塞利奥

我想编写一个函数,该函数接受两个Maybe Int参数,如果两个参数都为最小值,则返回最小值;如果两个参数为,则返回Just number“另一个” Nothing我对第一次尝试不满意:

maybeMin :: Maybe Int -> Maybe Int -> Maybe Int
maybeMin Nothing arr = arr
maybeMin ell Nothing = ell
maybeMin ell@(Just l) arr@(Just r) = if l < r then ell else arr

作为一种优化,我不想在第三种情况下创建新值。即,我不想写

maybeMin ell@(Just l) arr@(Just r) = Just $ if l < r then l else r

上面的代码看起来笨重,在我看来,我应该能够利用的事实,Maybe是一个实例FunctorApplicativeMonad但是,我尝试更高阶的尝试不会做相同的事情:

maybeMin ell arr = ell >>= (\l -> arr >>= (\r -> if l < r then ell else arr))

因为Nothing如果任一操作数为,它将返回Nothing

有一种优雅的方式来做我想要的吗?

DDub

你看着FunctorApplicative以及Monad,但你可能想看看Alternative作为其用法的一个例子,Just 3 <|> Nothing将屈服Just 3而不是Nothing

对于您的特定用途,如果您想要单线,则可以尝试:

maybeMin l r = min l r <|> l <|> r

只是为了打破下来,我们首先计算min l r,它使用Ord的实例Maybe给最低的lr如果两者都Just值。如果可行,那么计算将在那里停止,但是如果其中任何一个都不是Just,那么我们将检查是否l是一个Just值。如果是,那么就是结果,如果不是,我们最终将返回r结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在这种特定情况下,如何使用流获取列表列表?

在这种特定情况下,如何阻止Eclipse缩进多余的空格?

如何在特定情况下使用JavaScript加载特定的CSS文件?

在特定情况下如何避免内存不足问题

在特定情况下如何合并数据框?

在特定情况下如何在python中舍入任何数字

NodeJS在特定情况下使用错误

jQuery:在这种特定情况下,如何恢复点击事件的初始状态?

Three.js:在特定情况下如何添加autoRotate?

Jenkins脚本化管道:如何在此特定情况下应用@NonCPS注释

在这种特定情况下,如何修复损坏的包装?

如何在特定情况下捕获OnTouchEvent?

后缀运算符在这种特定情况下(JAVA)如何工作?

如何使用Meteor.users.update在特定情况下的对象中包含一个变量?

在这种特定情况下,如何设计类以共享其方法声明?

特定情况下的时序图

在特定情况下如何抑制声纳法则?

在我的特定情况下,如何在C#中选择正确的循环语句?

如何在特定情况下的Django注册自定义字段中使required = false

在特定情况下替换字符

在特定情况下,实体框架4.0死锁而不是块。如何解决这个问题?

特定情况下的开关盒

在特定情况下,如何使JRadioButton透明?

特定情况下的分段错误

如何在整个游戏的特定情况下使用玩家的输入

在这种特定情况下,如何使用 javascript 删除 HTML 元素

如何在特定情况下将while循环转换为递归方法

如何在我的特定情况下形成嵌套数组的数组?

在特定情况下使用 CSS Grid 布局