随笔分类 -  Scala

上一页 1 ··· 7 8 9 10 11 12 13 14 下一页
JVM编程语言
摘要:在前面几次讨论中我们介绍了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)
摘要:scala标准库提供了一个Either类型,它可以说是Option的升级版。与Option相同,Either也有两种状态:Left和Right,分别对应Option的None和Some,不同的是Left可以返回一个值。我们通常用这个值来表述异常信息。scalaz也提供了自己版本的Either,并用... 阅读全文
posted @ 2015-12-17 13:24 雪川大虫 阅读(968) 评论(0) 推荐(2)
摘要:说道FP,我们马上会联想到Monad。我们说过Monad的代表函数flatMap可以把两个运算F[A],F[B]连续起来,这样就可以从程序的意义上形成一种串型的流程(workflow)。更直白的讲法是:任何类型只要实现了flatMap就可以用for-comprehension, for{...}y... 阅读全文
posted @ 2015-12-15 17:48 雪川大虫 阅读(1056) 评论(0) 推荐(0)
摘要:我们经常提到函数式编程就是F[T]。这个F可以被视为一种运算模式。我们是在F运算模式的壳子内对T进行计算。理论上来讲,函数式程序的运行状态也应该是在这个运算模式壳子内的,也是在F[]内更新的。那么我们就应该像函数式运算T值一样,也有一套函数式更新程序状态的方法。之前我们介绍了Writer Mona... 阅读全文
posted @ 2015-12-11 10:59 雪川大虫 阅读(1397) 评论(0) 推荐(2)
摘要:在上一篇讨论里我们简单的介绍了一下Cake Pattern和Reader Monad是如何实现依赖注入的。主要还是从方法上示范了如何用Cake Pattern和Reader在编程过程中解析依赖和注入依赖。考虑到依赖注入模式在编程中的重要性和普遍性,觉着还需要再讨论的深入一些,使依赖注入模式在FP领... 阅读全文
posted @ 2015-12-04 11:50 雪川大虫 阅读(1006) 评论(0) 推荐(1)

上一页 1 ··· 7 8 9 10 11 12 13 14 下一页