自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(9)
  • 收藏
  • 关注

原创 Scalaz(37)- Free :实践-DB Transaction free style

我一直在不断的提示大家:FP就是Monadic Programming,是一种特殊的编程风格。在我们熟悉的数据库编程领域能不能实现FP风格呢?我们先设计一些示范例子来分析一下惯用的数据库编程过程:import scalaz._import Scalaz._import scala.language.higherKindsimport scala.language.implicitConv

2016-03-30 12:26:01 756

原创 Scalaz(36)- Free :实践-Free In Action - 实用体验

在上面几期讨论中我们连续介绍了Free Monad。因为FP是纯函数编程,也既是纯函数的组合集成,要求把纯代码和副作用代码可以分离开来。Free Monad的程序描述(AST)和程序实现(Interpretation)关注分离(separation of concern)模式恰恰能满足FP要求。我们可以用一些代数数据类型(ADT Algebraic Data Type)来模拟功能,再把这些ADT组

2016-03-28 11:46:36 494

原创 Scalaz(35)- Free :运算-Trampoline,say NO to StackOverflowError

在前面几次讨论中我们介绍了Free是个产生Monad的最基本结构。它的原理是把一段程序(AST)一连串的运算指令(ADT)转化成数据结构存放在内存里,这个过程是个独立的功能描述。然后在独立的运算过程中Interpreter会遍历(traverse)AST结构,读取结构里的运算指令,具体运行指令。这里的重点是把一连串运算结构化(reify)延迟运行,具体实现方式是把Monad的连续运算方法flatM

2016-03-25 21:18:43 581

原创 Scalaz(34)- Free :算法-Interpretation

我们说过自由数据结构(free structures)是表达数据类型的最简单结构。List[A]是个数据结构,它是生成A类型Monoid的最简单结构,因为我们可以用List的状态cons和Nil来分别代表Monoid的append和zero。Free[S,A]是个代表Monad的最简单数据结构,它可以把任何Functor S升格成Monad。Free的两个结构Suspend,Return分别代表了

2016-03-23 09:49:20 502

原创 Scalaz(33)- Free :算式-Monadic Programming

在任何模式的编程过程中都无法避免副作用的产生。我们可以用F[A]这种类型模拟FP的运算指令:A是可能产生副作用的运算,F[_]是个代数数据类型ADT(Algebraic Data Type),可以实现函数组合(functional composition),我们可以不用理会A,先用F[_]来组合形成描述功能的抽象程序AST(Abstract Syntax Tree),对A的运算可以分开另一个过程去实现,而且可以有多种的运算实现方式,这样就达到了算式AST(Monadic Programming)、算法(In

2016-03-19 15:46:10 411

原创 Scalaz(32)- Free :lift - Monad生产线

在前面的讨论里我们提到自由数据结构就是产生某种类型的最简化结构,比如:free monoid, free monad, free category等等。我们也证明了List[A]是个free monoid。我们再看看free monad结构Free的定义:scalaz/Free.scala/** A free operational monad for some functor `S`. Bi

2016-03-18 08:12:37 579

原创 Scalaz(31)- Free :自由数据结构-算式和算法的关注分离

我们可以通过自由数据结构(Free Structure)实现对程序的算式和算法分别考虑。算式(Abstract Syntax Tree, AST)即运算表达式,是对程序目的的描述。算法则是程序的具体运算方式(Interpreter),它赋予了算式意义。下面我们先简单解释yi x

2016-03-12 21:30:34 507

原创 Scalaz(30)- Free :Natural Tranformation ~> - map higher kinded types for free

当我们需要定义一些对应高阶类型进行相互类型转换的操作函数时,我们发现scala语言并不提供能定义这种函数的支持。举例来说:如果我们希望定义一个函数把对于任何T值的Option[T]转换成List[T]的话,我们可能这样定义:def toList[T](opt: Option[T]): List[T] = opt.toList

2016-03-11 14:47:11 631

原创 Scalaz(29)- Free :Coyoneda - Functor for free

很多时候我们会遇到一些高阶类型F[_],但又无法实现它的map函数,也就是虽然形似但F不可能成为Functor。看看下面的例子:trait Interact[A]case class Ask(prompt: String) extends Interact[String]case class Tell(msg: String) extends Interact[Unit]In

2016-03-11 07:55:27 605

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除