google到数学里定义的群(group): G为非空集合,如果在G上定义的二元运算 *,满足 (1)封闭性(Closure):对于任意a,b∈G,有a*b∈G (2)结合律(Associativity):对于任意a,b,c∈G,有(a*b)*c=a*(b*c) (3)幺元 (Identity):存在幺元e,使得对于任意a∈G,e*a=a*e=a (4)逆元:对于任意a∈G,存在逆元a^-1,使得a^-1*a=a*a^-1=e 则称(G,*)是群,简称G是群. 如果仅满足封闭性和结合律,则称G是…
大致介绍了幺半群(monoid)后,我们重新回顾最初引用wadler(haskell委员会成员,把monad引入haskell的家伙)的那句话: 现在我们来解读这句话中包含的另一个概念:自函子(Endofunctor),不过我们先需要一些铺垫: 首先,什么是函子(Functor)? 乍一看名字,以为函子(functor)对函数(function)是一种封装,实际没有关系,尽管他们都是表示映射,但两者针对的目标不一样. 函数表达的映射关系在类型上体现在特定类型(proper type)之间的映射,…
中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾经看到一段对Monad的描述:“Monadic for-comprehension就是一种嵌入式编程语言,由它的Monad提供它的语法”.但如果每一种Monad的for-comprehension都独立提供一套语法的话,这种编程语言就显得十分单调.功能简单了.那么既然是FP,我们应该可以通过函数组合…
参考文档1 参考文档2 函数式编程术语 高阶函数 Higher-Order Functions 以函数为参数的函数 返回一个函数的函数 函数的元 Arity 比如,一个带有两个参数的函数被称为二元函数 惰性求值 Lazy evaluation 是一种按需求值机制,它会延迟对表达式的求值,直到其需要为止 // 设置一个随机数,需要时,才会计算,每次计算都是一个不同的值 const rand = function*() { while (1 < 2) { yield Math.random() }…
介绍monads有点像互联网时代的家庭手工业.我想 “为什么要反对传统?”,但这篇文章将以Scala对待monads的方式来描述. 有个古老的寓言,讲述了几个瞎子第一次摸到大象.一个抱着大象的腿说:“它是一棵树”:另一个摸着大象的鼻子则说:“它是一条大蛇”:第三个则说:“它是一把扇子”... 从这个寓言我们可以得到个结论:古人相信视觉障碍者喜欢调戏大型哺乳动物(此句英文原意可能带有其它含义).幸运的是我们生活在一个更开明的时代.我们也应该了解自己的局限,防止它阻碍我们把握事物的全貌,在某些方面,…
再谈continuation monad 上一篇中我们已经介绍了continuation monad,但是这个monad与Identity,Maybe,IEnumerable monads稍微难于理解,故本篇再次讨论. 首先解决上一篇中最后关于continuation monad的问题,即以下这段代码目前还无法通过编译, .ToContinuation<int, string>() .ToContinuation<int, string>() select x + y; Conso…
MonadState 类型类 class Monad m => MonadState s m | m -> s where get :: m s get = state (\s -> (s, s)) put :: s -> m () put s = state (\_ -> ((), s)) state :: (s -> (a, s)) -> m a state f = do s <- get let ~(a, s') = f s put s' return…
scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现.这是因为外界的输入是不可预料的,对于系统本身就是无穷的,比如键盘鼠标输入什么时候终止.网站上有多少网页.数据库中还有多少条记录等等.但对无穷数据流的运算又引发了新的挑战.我们知道,fp程序的主要运算方式是递归算法,这是个问题产生的源泉:极容易掉入StackOverflowError陷阱.相信许多人对scalaz-stream如何实现无穷数据的运算安全都…
scalaz-stream是一个泛函数据流配件库(functional stream combinator library),特别适用于函数式编程.scalar-stream是由一个以上各种状态的Process串联组成.stream代表一连串的元素,可能是自动产生或者由外部的源头输入,如:一连串鼠标位置:文件中的文字行:数据库记录:又或者一连串的HTTP请求等.Process就是stream转换器(transducer),它可以把一种stream转换成另一种stream.Process的类型款式…
Category Theory: 01 One Structured Family of Structures 这次看来要放弃了.看了大概三分之一.似乎不能够让注意力集中了.先更新吧. 群的定义 \(G = \{ G, +, e \}\),一个数据集\(G\),一个二元操作符\(+\),和一个幺元\(e\). 满足结合律:\((a + b) + c = a + (b + c)\) 满足封闭性. 存在单位元:\(e + a = a = a + e\) 存在逆元:对于每一个a,存在一个逆元a': \…