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

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

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

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

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

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

砸蛋大叔砸蛋大叔提问于
萌萌哒小昕玥一直积极治疗的神经病~回答于

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

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

翻译为:

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,在不匹配的情况下调用:

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

回答过的其他问题

腾讯云的实时语音趣味变声是如何实现的呢?有哪些应用场景呢?

萌萌哒小昕玥一直积极治疗的神经病~
腾讯云游戏多媒体引擎(Game Multimedia Engine,简称GME),是一个专门针对游戏场景定制的,可覆盖休闲社交类、MOBA 类、MMORPG 等多种游戏类型,能提供包括多人实时语音、语音消息、语音转文本 3D位置语音、趣味变声、伴奏K歌等功能,满足多样化的游戏语音...... 展开详请

新租用的云主机SCP无法登陆?

萌萌哒小昕玥一直积极治疗的神经病~

首先你的服务器需要是linux系统 开通22端口才可以

直播答题抢占了谁的时间?

萌萌哒小昕玥一直积极治疗的神经病~

原来每天晚上必看直播,自从玩了半个月答题,现在基本上没有看直播的习惯了,不答题也去做点别的,你这么一提还真是有点潜移默化。

腾讯云里面没有安装依赖?

萌萌哒小昕玥一直积极治疗的神经病~

这些都没装 你可以选择镜像市场的 已经装好的环境依赖

腾讯云SCF无服务器云函数有哪些应用?

萌萌哒小昕玥一直积极治疗的神经病~

以后应该会广泛应用到,酒香不怕巷子深

为什么我在腾讯云买的域名实名审核还没有审核好?

萌萌哒小昕玥一直积极治疗的神经病~
已采纳

别急撒 好想说的是3-5个工作日是吧 今天才第二天

关于作者

萌萌哒小昕玥

一直积极治疗的神经病~

所属标签

扫码关注云+社区