context里的值,输出普通值 + 普通值:用pure包一下再调 所以,就这个场景(把是否处于context里的函数应用到是否处于context里的值)而言,拥有Functor、Applicative和Monad...monad的context中,而不是整个程序的失败 五.List Monad instance Monad [] where xs >>= f = [y | x <- xs,...(n,ch)) -- 加括号完整版 ([1, 2] >>= (\n -> (['a','b'] >>= (\ch -> return (n,ch))))) 函数体没界限就匹配到最右端,相关讨论见Haskell...n,ch) | n <- [1,2], ch <- ['a','b'] ] 实际上,List Comprehension和do表示法都只是语法糖,最后都会转换成>>=进行计算 六.Monad laws....用>=>描述的Monad laws,更大的意义在于这3条是形成数学范畴所必须的规律,从此具有范畴的数学意义,具体见Category theory MonadPlus 同时满足Monad和Monoid的东西有专用的名字
写在前面 最早接触过IO Monad,后来又了解了Maybe Monad和List Monad,实际上还有很多Monad(比如Writer Monad、Reader Monad、State Monad...等),位于mtl package,可以通过ghc-pkg命令来查看: $ ghc-pkg list | grep mtl mtl-2.2.1 P.S.Haskell Platform默认包含mtl package...从Monad实现来看,从左侧取出值a和附加信息w,将右侧函数应用到a上,并从结果取出值b和附加信息w',结果值为b,附加信息为w `mappend` w',最后用return包装结果返回m类型的值,作为...虽然我们也可以用 Haskell 写出这样的程序,但有时候写起来蛮痛苦的。这也是为什么 Haskell 要加进 State Monad 这个特性。...) P.S.注意,Control.Monad.Error和Control.Monad.Trans.Error都已经过时了,建议使用Control.Monad.Except,具体见Control.Monad.Error
Welcome to Haskell 在上一篇文章中,我通过几个Java的例子简单的说明了Monad的本质和一些工程中常见的用途。接下来的文章就不再侧重于工程了,而是要慢慢向理论转换。...我们先来改写之前的Monad:Optional和List。...instance Monad List where xs >>= f = lconcat $ lmap f xs 至此,我们就在Haskell中完成了Monad的实现。...包括: return(Monad)和pure(Applicative)函数实际上是一致的 >>(Monad)和*>(Applicative)实际上是一致的 liftM、liftA和fmap是一致的 liftM...不过,这也只解释了为什么如今Haskell的Applicative和Monad是这种状态。那么,是什么原因使Haskell冒着把标准库搞乱的风险也要引入Applicative呢?
Definition parser (T : Type) := list token → optionE (T * list token). newtype Parser a = Parser (String...Haskell explicit recursion depth, .e. step-indexed explicit exception optionE (in Haskell, it’s hidden...behind the Parser Monad as []) explicit string state xs (in Haskell, it’s hidden behind the Parser Monad...as String -> String) explicit accepted token (in Haskell, it’s hidden behind the Parser Monad as a,...(x : xs) ident Definition parseIdentifier (xs : list token) : optionE (string * list token) := match
支持Erlang风格的模式匹配(pattern matching)和哨兵表达式。...你也能在Haskell中发现Clojure风格的惰性求值(lazyevaluation)以及与Clojure和Erlang相同的列表推导语法。...无副作用,通过monad概念保存状态:一个Haskell函数可以返回一个有副作用并且会被延迟执行的结果....Your backwards is " ++ backwards) Definitions of return and bind(>>==) instance Monad [] where m...Monad -} data Maybe a = Nothing | Just a instance Monad Maybe where return = Just Nothing
有一个特殊幺元,能够和任何元素组合,导致的结果是不改变这些元素。 函子到底是什么? 一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...image.png fmap的输入参数是a->b函数,在我们这个案例中是(+3),然后定义一个函子Functor,这里是Haskell的Just 2,最后返回一个新的函子,在我们案例中,使用Haskell...image.png 那么函子、applicative和Monad三个区别是什么? ? image.png functor: 应用一个函数到包裹的值,使用fmap/map....在Haskell中,函子是在其上可以map over的东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...在Haskell这类的强类型语言中,我们甚至可以组装自己的Tuple Monad。
先前我在某群提到,从Optional(也就是Haskell的Maybe)理解Monad会是一个很不错的方式。...{ return new MyOptional(null); } } 虽然调用的格式还是和Identity一样,只不过现在链式调用是完全空安全的。...()); } } 而这个定义,就是大多数编程语言(比如Scala、Haskell)对Monad的定义。...: lists.list) { result.addAll(((MonadList) list).list); } return new...文中没有提及flatMap需要遵守的规则,对Monad的定义也不太完备(缺少了return),也没有细究join和flatMap的互相实现。要真正理解Monad,理论上的内容同样是不可避免的。
例如,这是在一个没有 Maybe 的语言中处理一个数据库记录的方式: post = Post.find_by_id(1) if post return post.title else return...Monad 将一个返回已包装值的函数应用到一个已包装的值上。 Monad 有一个函数 ))=(在 Haskell 中是 >>=,读作“绑定”)来做这个。 让我们来看个示例。...Monad 是 Haskell 中的另一个类型类。...(Haskell 中的)applicative 是实现了 Applicative 类型类的数据类型。 (Haskell 中的)monad 是实现了 Monad 类型类的数据类型。...请参阅《Haskell 趣学指南》的《来看看几种 Monad》。 其中包含很多我已经炫耀过的东西,因为 Miran 深入这些方面做的非常棒。
Monad不就是个自函子范畴上的幺半群,这有什么难理解的(A monad is just a monoid in the category of endofunctors) —— Phillip Wadler...范畴 图中范畴C1和范畴C2之间有映射关系,C1中Int映射到C2中的List[Int],C1中String映射到C2中的List[String]。...在Haskell中,函子是在其上可以map over的东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...这里f和f1代表的调用顺序产生同样的结果,说明元组自函子范畴满足结合律。...在Haskell这类的强类型语言中,我们甚至可以组装自己的Tuple Monad。
Action,否则值为return (),所以相当于: when' c io = do if c then io else return () 这个东西的类型是: when' :: Monad m...-- 找两个对应实例,List和IO instance Traversable [] -- Defined in ‘Data.Traversable’ instance Monad IO -- Defined...in ‘GHC.Base’ 在I/O List的场景(把m换成IO,t换成[]),参数的类型约束是[IO a],返回值的类型约束是IO [a],所以相当于: sequence' [] = do return...[] sequence' (x:xs) = do v <- x others <- (sequence' xs) return (v : others) 作用是把I/O List中所有I/O结果收集起来...作用相当于先对[a]做映射,得到I/O List,再来一发sequence,例如: > mapM (\x -> do return $ x + 1) [1, 2, 2] [2,3,3] > mapM print
Javascript的返回值 Javascript中的返回值总共分为四类: return; return false; return true; return variable(变量); 这四种返回值其实有很大的不同...2. return 首先介绍return;,直接用代码来说明,先看下面的代码: var i=(function(){return;})(); alert(i); function(){return;}为匿名函数...3. return false return false的介绍还是直接上代码: var i=(function(){return false;})(); alert(i); 运行alert(i)的输出结果为...4. return true return true的介绍也是上代码: var i=(function(){return false;})(); alert(i); 运行alert(i)的输出结果为true...5. return variable return variable主要是在Javascript中定义一个变量,在函数中进行返回,与通常的返回变量没有区别。
1、返回值int 类型的函数返回: return语句用来结束循环,或返回一个函数的值。 return 0:一般用在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。...2、布尔类型返回: return 0:返回假; return 1:返回真; 一般这样的函数用来实现一个判断是否的逻辑,或检查有无的数据。返回真表示“是”,返回假表示“否”!...return 0 代表程序正常退出,return 1代表程序异常退出! 使用return 语句可以返回一个变量内的值或一个指针,也可用return0,表示返回为空。...return 代表调到函数外, return 0代表函数正常终止 return 1代表函数非正常终止 return 关键字的作用是返回程序流程的控制权!其副作用是返回一个值。...例如int main(){}则必须返回一个值 return 0代表函数正常终止 ruturn 1代表函数非正常终止 被调函数 return 1只是给主调函数一个标志,说明他的执行过程遇到异常情况。
post.title else return nil end But in Haskell: fmap (getPostTitle) (findPost 1) If findPost returns...If it returns Nothing, we will return Nothing! Pretty neat, huh?...: getPostTitle (findPost 1) Here's another example: what happens when you apply a function to a list...Haskell also provides us with some syntactical sugar for monads, called do notation: foo = do filename...不同类型的Monad实例则会支持不同的程序运算行为,如:Option Monad在运算中如果遇到None值则会中途退出;State Monad会确保状态值会伴随着程序运行流程直到终结;List Monad
和一个函数,返回一个新的 monad。...m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a return和 applicative...>>=前面说过了,>>有一个默认实现,就是把一个 monad 直接换成另一个 monad 返回,fail不会被主动调用,在一些特定语法结构中,会被 Haskell 用于模式匹配。...一个类型要成为 monad 不仅要满足 Monad 类型类的条件,还要满足 monad 定律(虽然编译器并不会帮你检查): 左单位元:return x >>= f 和 f x 等价 右单位元:m >>=...return 和 m 等价 结合律:(m >>= f) >>= g 和 m >>= (\x -> f x >>= g) 等价
t : list) { result.add(f.apply(t)); } return new FList(result); }...I don't use any real monad implementation like Promise or List to emphasize the core concept....This pattern of applying a function of two arguments (m and d in our case) is so common that in Haskell...From list of monads to monad of list Another useful operator that originates from flatMap() is sequence...monad of a list of that type.
来看看几种 Monad https://learnyoua.haskell.sg/content/zh-cn/ch12/a-fistful-of-monads.html 当我们第一次谈到 Functor...他是被 Haskell 用在处理语法错误的情况。我们目前不需要太在意 fail。 我们知道了 Monad typeclass 长什么样子,我们来看一下 Maybe 的 Monad instance。...do 表示法 Monad 在 Haskell 中是十分重要的,所以我们还特别为了操作他设置了特别的语法:do 表示法。...Just 100003 对于 list monad 而言,return 是把值放进一个 list 中,变成只有一个元素的 list。...如果我们仔细查看 list monad 的范例,会发现 >>= 的实作是: xs >>= f = concat (map f xs) 所以当我们将 [1,2,3,4] 丢给 return,第一个 return
a] | otherwise = (drop a . take (b + 1)) xs 一条线被2个点分成3段,List中两个元素交换的结果就是第一段并上第二个点,并上中间那段,再并上第一个点和最后一段...6 EmptyTree (Node 7 EmptyTree EmptyTree)) (Node 9 EmptyTree EmptyTree)) (fromList及二叉搜索树的实现来自Monoid_Haskell...zipper-hole Zipper Monad The Zipper Monad is a generic monad for navigating around arbitrary data structures...:Current element: 2 Enter Return, q or the replacement value:Current element: 6 Enter Return, q or the...参考资料 Zipper Control.Zipper Control.Monad.Zipper Haskell error: Couldn’t match type ‘a’ with ‘b’
exit()和return的差别: 依照ANSI C,在最初调用的main()中使用return和exit()的效果同样。 但要注意这里所说的是“最初调用”。...假设main()在一个递归程序中,exit()仍然会终止程序;但return将 控制权移交给递归的前一级,直到最初的那一级。此时return才会终止程序。...return和exit()的还有一个差别 在于,即使在除main()之外的函数中调用exit(),它也将终止程序。
并且对于遵守Functor laws和Monad laws的类型,这两个函数是完全等价的,例如: > liftM (+1) (Just 1) Just 2 > fmap (+1) (Just 1) Just...- m1; return (f x1) } 等价于: liftM' f m = m >>= \x -> return (f x) 注意,这个实现并不依赖Functor的特性,仅靠Monad具有的行为就可以完成...更进一步的,如果要实现自定义Monad,可以先实现return和>>=,然后就很容易实现Applicative(令 = ap,pure = return)和Functor(令fmap = liftM...因为List的>>=实现是List Comprehension: xs >>= f = [y | x <- xs, y <- f x] 所以在List的场景,等价于: joinList...P.S.之所以能进行这样巧妙的变换,是因为Haskell函数默认的柯里化特性,只有填满参数,才返回值。
前段时间学了下 Haskell,看完了《Haskell 趣学指南》,刷了一些题,《Real World Haskell》正在看。...最大的感受是,以前对 Functor、Applicative 和 Monad 的理解太片面了。...Functor 谈 Monad(单子) 之前还是要谈谈 Functor(函子),毕竟所有的 Monad 都是 Functor。...在范畴论中,函子是范畴间的一类态射(这个定义给我的直观感受是函子指的是 fmap 函数……),数学上的概念就不多说了,下面我们来看看 Haskell 中的 Functor。...Haskell 中有一个叫 Functor 的类型类(暂时可以粗略地理解为 OO 语言中的接口),它的定义是这样的: class Functor f where fmap :: (a -> b) -
领取专属 10元无门槛券
手把手带您无忧上云