随笔分类 -  Scalaz

Scala泛函组件库
摘要:一直感觉FP比较虚,可能太多学术性的东西,不知道如何把这些由数学理论在背后支持的一套全新数据类型和数据结构在现实开发中加以使用。直到Free Monad,才真正感觉能用FP方式进行编程了。在前面我们已经花了不小篇幅来了解Free Monad,这次我想跟大家讨论一下用Free Monad来编写一个真正 阅读全文
posted @ 2016-04-18 11:17 雪川大虫 阅读(2766) 评论(0) 推荐(0)
摘要:很多函数式编程爱好者都把FP称为Monadic Programming,意思是用Monad进行编程。我想FP作为一种比较成熟的编程模式,应该有一套比较规范的操作模式吧。因为Free能把任何F[A]升格成Monad,所以Free的算式(AST)、算法(Interpreter)关注分离(separati 阅读全文
posted @ 2016-04-12 11:14 雪川大虫 阅读(744) 评论(0) 推荐(0)
摘要:我一直在不断的提示大家:FP就是Monadic Programming,是一种特殊的编程风格。在我们熟悉的数据库编程领域能不能实现FP风格呢?我们先设计一些示范例子来分析一下惯用的数据库编程过程: 我这里模拟了一个培训学校内的一些业务。上面设计的是一些基本函数,可以分别对学员、导师、座位进行查询和更 阅读全文
posted @ 2016-03-30 12:25 雪川大虫 阅读(608) 评论(0) 推荐(0)
摘要:在上面几期讨论中我们连续介绍了Free Monad。因为FP是纯函数编程,也既是纯函数的组合集成,要求把纯代码和副作用代码可以分离开来。Free Monad的程序描述(AST)和程序实现(Interpretation)关注分离(separation of concern)模式恰恰能满足FP要求。我们 阅读全文
posted @ 2016-03-28 11:46 雪川大虫 阅读(545) 评论(0) 推荐(0)
摘要:在前面几次讨论中我们介绍了Free是个产生Monad的最基本结构。它的原理是把一段程序(AST)一连串的运算指令(ADT)转化成数据结构存放在内存里,这个过程是个独立的功能描述过程。然后另一个独立运算过程的Interpreter会遍历(traverse)AST结构,读取结构里的运算指令,实际运行指令 阅读全文
posted @ 2016-03-25 21:18 雪川大虫 阅读(566) 评论(0) 推荐(0)
摘要:我们说过自由数据结构(free structures)是表达数据类型的最简单结构。List[A]是个数据结构,它是生成A类型Monoid的最简单结构,因为我们可以用List的状态cons和Nil来分别代表Monoid的append和zero。Free[S,A]是个代表Monad的最简单数据结构,它可 阅读全文
posted @ 2016-03-23 09:49 雪川大虫 阅读(552) 评论(0) 推荐(0)
摘要:在任何模式的编程过程中都无法避免副作用的产生。我们可以用F[A]这种类型模拟FP的运算指令:A是可能产生副作用的运算,F[_]是个代数数据类型ADT(Algebraic Data Type),可以实现函数组合(functional composition),我们可以不用理会A,先用F[_]来组合形成 阅读全文
posted @ 2016-03-19 15:46 雪川大虫 阅读(576) 评论(0) 推荐(0)
摘要:在前面的讨论里我们提到自由数据结构就是产生某种类型的最简化结构,比如:free monoid, free monad, free category等等。我们也证明了List[A]是个free monoid。我们再看看free monad结构Free的定义:scalaz/Free.scala 我们在上 阅读全文
posted @ 2016-03-18 08:12 雪川大虫 阅读(795) 评论(0) 推荐(1)
摘要:   我们可以通过自由数据结构(Free Structure)实现对程序的算式和算法分离关注(separation of concern)。算式(Abstract Syntax Tree, AST)即运算表达式,是对程序功能的描述。算法则是程序的具体运算方式(Interpreter),它赋予了算式意 阅读全文
posted @ 2016-03-12 21:30 雪川大虫 阅读(738) 评论(0) 推荐(0)
摘要:当我们需要定义一些对应高阶类型进行相互类型转换的操作函数时,我们发现scala语言并不提供能定义这种函数的支持。举例来说:如果我们希望定义一个函数把对于任何T值的Option[T]转换成List[T]的话,我们可能这样定义: 1 def toList[T](opt: Option[T]): List 阅读全文
posted @ 2016-03-11 14:47 雪川大虫 阅读(411) 评论(0) 推荐(0)
摘要:很多时候我们会遇到一些高阶类型F[_],但又无法实现它的map函数,也就是虽然形似但F不可能成为Functor。看看下面的例子: trait Interact[A] case class Ask(prompt: String) extends Interact[String] case class 阅读全文
posted @ 2016-03-11 07:55 雪川大虫 阅读(544) 评论(0) 推荐(0)
摘要:函数式编程模式强调纯代码(pure code),主要实现方式是使用不可变数据结构,目的是函数组合(composability)最终实现函数组件的重复使用。但是,如果我们在一个函数p内部使用了可变量(mutable variables),如果函数的输入参数e是纯代码,那么表达式p(e)同样是纯代码的, 阅读全文
posted @ 2016-02-29 08:12 雪川大虫 阅读(641) 评论(0) 推荐(0)
摘要:经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了。 本来不想花什么功夫在scala的类型系统上,但在阅读scalaz源代码时往往遇到类型层面的编程(type level progra 阅读全文
posted @ 2016-02-23 21:04 雪川大虫 阅读(905) 评论(0) 推荐(1)
摘要:scala中的case class是一种特殊的对象:由编译器(compiler)自动生成字段的getter和setter。如下面的例子: 这里我们可以看到:Person是个多层次对象,包含多层嵌入属性对象(multi-layer embeded objects)。如果需要更改Person类型实例中的 阅读全文
posted @ 2016-01-30 11:53 雪川大虫 阅读(1168) 评论(0) 推荐(0)
摘要:中间插播了几篇scalaz数据类型,现在又要回到Monad专题。因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad、熟练掌握Monad运用。曾经看到一段对Monad的描述:“Monadic for-comprehension就是一种嵌入式编... 阅读全文
posted @ 2016-01-20 08:43 雪川大虫 阅读(1074) 评论(0) 推荐(0)
摘要:上节我们讨论了Zipper-串形不可变集合(immutable sequential collection)游标,在串形集合中左右游走及元素维护操作。这篇我们谈谈Tree。在电子商务应用中对于xml,json等格式文件的处理要求非常之普遍,scalaz提供了Tree数据类型及相关的游览及操作函数能... 阅读全文
posted @ 2016-01-08 08:28 雪川大虫 阅读(1011) 评论(0) 推荐(1)
摘要:外面沙尘滚滚一直向北去了,意识到年关到了,码农们都回乡过年去了,而我却留在这里玩弄“拉链”。不要想歪了,我说的不是裤裆拉链而是scalaz Zipper,一种泛函数据结构游标(cursor)。在函数式编程模式里的集合通常是不可变的(immutable collection),我们会发现在FP编程过... 阅读全文
posted @ 2016-01-06 21:28 雪川大虫 阅读(993) 评论(0) 推荐(1)
摘要:马上进入新的一年2016了,来点轻松点的内容吧。前面写过一篇关于用Reader实现依赖注入管理的博文(Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad)。刚好年底这几天抽空重审了一遍,这时才真正认识到让一个老资格OOP程序猿去编... 阅读全文
posted @ 2015-12-30 09:04 雪川大虫 阅读(774) 评论(2) 推荐(1)
摘要:Leskov,Leibniz,别扭的名字,是什么地干活?碰巧从scalaz源代码里发现了这么个东西:scalaz/BindSyntax.scala/** Wraps a value `self` and provides methods related to `Bind` */final clas... 阅读全文
posted @ 2015-12-29 08:55 雪川大虫 阅读(762) 评论(0) 推荐(2)
摘要:scalaz还提供了个type class叫Validation。乍看起来跟\/没什么分别。实际上这个Validation是在\/的基础上增加了Applicative功能,就是实现了ap函数。通过Applicative实例就可以同时运算多个Validation并返回多条异常信息。所以,\/与Val... 阅读全文
posted @ 2015-12-17 18:14 雪川大虫 阅读(752) 评论(0) 推荐(0)