Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Monad‘Fail’vs MonadPlus‘mzero’的适当使用是什么?

Monad‘Fail’vs MonadPlus‘mzero’的适当使用是什么?

提问于 2018-02-05 16:09:56
回答 2关注 0查看 277

failMonad中的方法被一些人认为是一个坑;这是对类的任意添加,而不是来自原始的范畴理论。当然,在当前的情况下,许多Monad类型具有逻辑和有用性fail实例。

MonadPlus类是Monad的子类,它提供了mzero方法,该方法逻辑地将失败的概念封装在一个单一的单元中。

因此,一个库设计人员如果想要编写一些执行某种故障处理的一元代码,可以选择让他的代码使用fail方法,或者将其代码限制在MonadPlus类中,这样他就可以对使用mzero即使他不关心单性组合mplus完全是行动。

关于这个主题的一些讨论在这个wiki页面中关于改革MonadPlus课程的建议。

所以我想我有一个具体的问题:

如果有的话,哪一个单一的例子有一个自然的fail方法,但不能是MonadPlus的实例,因为它们没有逻辑实现mplus

回答 2

萌萌哒小昕玥

发布于 2018-02-06 02:05:19

为了简化monad的使用,并使抽象出monad的用法更容易,他们引入了do。例如,此代码:

代码语言:javascript
运行
AI代码解释
复制
do putStr "What's your full name? "
   [name,surname] <- getLine >>= return . words
   putStr "How old are you? "
   age <- getLine >>= return . read
   if age >= 18
      then putStrLn $ "Hello Mr / Ms " ++ surname
      else putStrLn $ "Hello " ++ name

翻译为:

代码语言:javascript
运行
AI代码解释
复制
putStr "What's your full name? " >>
getLine >>= return . words >>= \[name,surname] ->
putSr "How old are you? " >>
getLine >>= return . read >>= \age ->
if age >= 18
   then putStrLn $ "Hello Mr / Ms " ++ surname
   else putStrLn $ "Hello " ++ name

fail,在不匹配的情况下调用:

代码语言:javascript
运行
AI代码解释
复制
putStr "What's your full name? " >> let
  helper1 [name,surname] =
    putSr "How old are you? " >> let
      helper2 age =
        if age >= 18
           then putStrLn $ "Hello Mr / Ms " ++ surname
           else putStrLn $ "Hello " ++ name
      helper2 _ = fail "..."
    in getLine >>= return . read >>= helper2
  helper1 _ = fail "..."
in getLine >>= return . words >>= helper1

全球资讯翻译官

发布于 2018-02-06 00:47:18

Either它是一元实例,如下所示:

代码语言:javascript
运行
AI代码解释
复制
{-# LANGUAGE FlexibleInstances #-}
instance Monad (Either String) where
  (Left x) >>= _   = Left x
  (Right a)  >>= f = f a
  return           = Right
  fail             = Left

每一个实例mplus应符合这两条法律:

代码语言:javascript
运行
AI代码解释
复制
mzero `mplus` a -> a
a `mplus` mzero -> a

合理的MonadPlus例如:

代码语言:javascript
运行
AI代码解释
复制
instance MonadPlus (Either a) where
  mzero = Left undefined
  mplus (Left _) b = b
  mplus a _        = a

mplus返回第二次计算。注意它与(>>)它不符合法律:

代码语言:javascript
运行
AI代码解释
复制
Left a   >>    Right b -> Left a
Left a `mplus` Right b -> Right b

(>>)将在第一次计算时停止,而mplus而是尝试三。[]也有这样的行为:

代码语言:javascript
运行
AI代码解释
复制
[] >> [1..4] -> []
[] `mplus` [1..4] -> [1,2,3,4]

这只是为了讨论MonadPlus特别是mplus(>>)形成对比

和开发者交流更多问题细节吧,去 写回答
相关文章
Monad_Haskell笔记10
从类型来看,Functor到Applicative再到Monad是从一般到特殊的递进过程(Monad是特殊的Applicative,Applicative是特殊的Functor)
ayqy贾杰
2019/06/12
9040
来看看几种 Monad来看看几种 Monad
https://learnyoua.haskell.sg/content/zh-cn/ch12/a-fistful-of-monads.html
一个会写诗的程序员
2018/12/12
1.2K0
Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus
  在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(context)内施用一些函数。再直白一
用户1150956
2018/01/05
9890
Scalaz(17)- Monad:泛函状态类型-State Monad
  我们经常提到函数式编程就是F[T]。这个F可以被视为一种运算模式。我们是在F运算模式的壳子内对T进行计算。理论上来讲,函数式程序的运行状态也应该是在这个运算模式壳子内的,也是在F[]内更新的。那么
用户1150956
2018/01/05
1.9K0
Scalaz(19)- Monad: \/ - Monad 版本的 Either
  scala标准库提供了一个Either类型,它可以说是Option的升级版。与Option相同,Either也有两种状态:Left和Right,分别对应Option的None和Some,不同的是L
用户1150956
2018/01/05
6200
Jquery中的done() fail() then() $when()到底是什么
有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。
Daotin
2019/08/09
2.4K0
Scalaz(25)- Monad: Monad Transformer-叠加Monad效果
中间插播了几篇scalaz数据类型,现在又要回到Monad专题。因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad、熟练掌握Monad运用。
用户1150956
2018/01/05
8690
Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming
用户1150956
2018/01/05
8410
第37期:适当的使用 MySQL 原生表分区
MySQL 数据库现在主要用的引擎是 InnoDB ,InnoDB 没有类似于 MERGE 引擎这样的原生拆表方案,不过有原生分区表,以水平方式拆分记录集,对应用端透明。
爱可生开源社区
2021/11/30
6380
第37期:适当的使用 MySQL 原生表分区
Monad
什么是函数(Function)? 函数表达的映射关系在类型上体现在特定类型(proper type)之间的映射。
lambeta
2018/08/17
1.5K0
Monad
图解 Monad
函数式编程有一个重要概念,叫做Monad。 网上有很多解释(这里和这里),但都很抽象,不容易看懂。我尝试了好多次,还是不明白Monad到底是什么。 昨天,我读到了Aditya Bhargava的文章,
ruanyf
2018/04/12
8830
图解 Monad
Monad 定律
monad 是支持>>=操作的 applicative 函子,>>=读作绑定,它的类型是:
Sheepy
2018/09/10
5400
Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad
该文章介绍了如何用传感器检测用户的生理指标,并使用机器学习算法来预测用户的健康状况。主要包括了传感器数据的获取、模型的构建和训练、应用程序的展示,以及使用传感器融合技术来提高预测的准确性。文章还介绍了如何使用传感器来检测用户的运动状态,并基于运动状态来控制智能设备的运作。
用户1150956
2018/01/05
6620
什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad
函数式编程的精髓就在于,我们可以用好多好多小小函数,搭搭搭,组成一个个大函数,最终写出整个程序来。比如我们想写一个函数
一个会写诗的程序员
2018/12/12
4.7K0
Java,你告诉我 fail-fast 是什么鬼?
说起来真特么惭愧:十年 IT 老兵,Java 菜鸟一枚。今天我才了解到 Java 还有 fail-fast 一说。不得不感慨啊,学习真的是没有止境。只要肯学,就会有巨多巨多别人眼中的“旧”知识涌现出来,并且在我这全是新的。
沉默王二
2019/10/31
5540
Java,你告诉我 fail-fast 是什么鬼?
说起来真特么惭愧:十年 IT 老兵,Java 菜鸟一枚。今天我才了解到 Java 还有 fail-fast 一说。不得不感慨啊,学习真的是没有止境。只要肯学,就会有巨多巨多别人眼中的“旧”知识涌现出来,并且在我这全是新的。
Java技术江湖
2019/11/11
5090
Java,你告诉我 fail-fast 是什么鬼?
Java 18 - fail fast与fail safe
在用迭代器遍历集合对象的时候, 如果遍历过程对集合对象的内容进行了修改(添加, 删除), 那么会抛出ConcurrentModificationException.
Reck Zhang
2021/08/11
3120
揭开 Monad 的神秘面纱
我们知道 Swift 语言支持函数式编程范式,所以函数式编程的一些概念近来比较火。有一些相对于OOP来说不太一样的概念,比如 Applicative, Functor 以及今天的主题 Monad. 如果单纯的从字面上来看,很神秘,完全不知道其含义。中文翻译叫做单子,但是翻译过来之后对于这个词的理解并没有起到任何帮助。
JoeyBlue
2021/09/07
3800
利用Fail2Ban保护你的服务器(Fail2Ban使用教程)
对于网站被恶意扫描、暴力破解、CC 攻击这一系列攻击,都有相似的特征,即高频率发请求导致主机资源使用率飙高。对于这些问题,我们可以借助一些工具来阻止类似行为以保护服务器的安全。
鹏程
2023/05/02
1.9K12
fail-safe fail-fast知多少
我们在使用集合类的时候,通常会需要去遍历集合中的元素,并在遍历中对其中的元素进行处理。这时候我们就要用到Iterator,经常写程序的朋友应该都知道,在Iterator遍历的过程中,是不能够修改集合数据的,否则就会抛出ConcurrentModificationException。
子润先生
2021/06/22
4200

相似问题

腾讯云MQTTCONNCET返回FAIL ,-101是什么原因?

0255

insertLivePusher:fail:access denied?

3873

request SmsSdk Appid verfify fail?

12K

request SmsSdk AppId verify fail?

0745

“connectSocket:fail url not in domain list”?

0242
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
相关问答用户
新浪微博 | 高级总监擅长4个领域
到家集团 | 技术VP擅长5个领域
擅长5个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档