![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从FP中理解scala
杨过悔
这个作者很懒,什么都没留下…
展开
-
Monads之flatMap,unit
Monads是个仿函数,但仿函数不一定是Monads,接下来是Monads的flatMap,unit特性一个Monads最小化traittrait Monad[M[_]] extends Functor[M] { def unit[A](a: => A): M[A] def flatMap[A,B](ma: M[A])(f: A => M[B]): M[B] def map[A,B]原创 2015-06-22 13:02:45 · 475 阅读 · 0 评论 -
scala之尾递归实际用处1
FP的Map函数是核心部分,采用分而治之,讲究以单元的方式处理数据,所以在一些“关联数据”处理时就不能直接Map处理了,最好的方式是采用命令编程方式处理,或者在Map中产生side-effect(不过很少怎么做的,FP函数讲究最大层次的Pure),下面我们使用尾递归处理下面是根据我的思路来写题目,可能最好方式不是尾递归,但将就着用吧实现对偶分组:建议自己思考后再参考我的答案 val原创 2015-06-23 19:49:00 · 553 阅读 · 0 评论 -
scala之尾递归_模板
package com.orgimport scala.annotation.tailrec/** * @author Administrator */object DemoTest extends App { val list:List[Int] = List(1,2,2,3,4,43,23,11,2,6,7,78,9) //目的-将list内的数据按奇偶分开, /原创 2015-06-23 20:47:44 · 509 阅读 · 0 评论 -
scala的标准类型
A Tour of Scala: Unified TypesCreated by admin on 2008-07-05. Updated: 2009-10-23, 16:18In contrast to Java, all values in Scala are objects (including numerical values and functions). Sin转载 2015-07-01 12:35:24 · 619 阅读 · 0 评论 -
scala书写规范1
符号操作符号操作都应该使用中缀表达的方式// right!"daniel" + " " + "Spiewak"// wrong!"daniel"+" "+"spiewak"高级函数使用函数作为参数的函数都应该使用中缀表达的方式names.map (_.toUpperCase) // wrong!这种类型是不标准的,因为在链式调用时// wrong!n原创 2015-07-01 13:17:15 · 493 阅读 · 0 评论 -
视图绑定
视图的绑定从另一个角度看就是implicit的转换主要用在两个场合1.当一个T类型的变量t要装换成A类型时2.当一个类型T的变量t无法拥有A类型的a方法或变量时其实视图的绑定是为了更方便的使用隐式装换如果我们不用视图绑定看看,这个表 def DigTest(a:Char)(implicit char2RichChar: Char => RichChar):Unit =原创 2015-07-01 09:54:53 · 590 阅读 · 0 评论 -
FP所渗透的范畴论
范畴论编辑范畴论是抽象地处理数学结构以及结构之间联系的一门数学理论。有些人开玩笑地称之为“一般化的抽象废话”。范畴论出现在很多数学分支中,以及理论计算机科学和数学物理的一些领域。[1] 中文名范畴论提出者塞缪尔·艾伦伯格和桑德斯·麦克兰恩提出时间1945应用学科数学原创 2015-07-02 19:49:12 · 928 阅读 · 0 评论 -
高阶函数的复用与组合
原文http://danielwestheide.com/blog/2013/01/23/the-neophytes-guide-to-scala-part-10-staying-dry-with-higher-order-functions.html这个是边看边记录的case class Email(subject: String,text: String,sender: Strin转载 2015-08-23 20:20:40 · 537 阅读 · 0 评论 -
match的嵌套绑定
scala> List((12,"23"),21,"33").map{ | case (id,p @"23") => print("1") | case _ => print("2") | }122res12: List[Unit] = List((), (), ())首先List是个元组序列,id用于绑定第一个变量,p用于绑定第二个变量,而其中我们使用原创 2015-08-05 22:26:46 · 484 阅读 · 0 评论 -
正则匹配
Programming scala的例子val BookExtractorRE = """Book: title=([^,]+),\s+authors=(.+)""".rval MagazineExtractorRE = """Magazine: title=([^,]+),\s+issue=(.+)""".rval catalog = List( "Book: titl原创 2015-08-05 22:07:43 · 400 阅读 · 0 评论 -
如何理解 Free Monad?
FP中有个比较拗口的monad : Free这里转自知乎的一个答案: 夏梓耀,理想主义码农,非战斗人员请迅速撤离凉宫礼、Alex RENG、king zin 等人赞同菜鸟来回答一下 Free最大的价值在于Monadic for-comprehension和Interpreter,前者只要描述算法,后者随意解释,可类比为接口和实现。Free 可以原创 2016-02-19 16:00:30 · 1109 阅读 · 0 评论 -
Monad transformers
monad很强大,当有时我们要连续使用多个monad怎么办,例如在scala使用for将多个monad连接起来,这样可以避免使用匹配,如果可以做到的话将是非常方便,而Monad transformers就是出于这样的目的 We have seen how monads can help handling IO actions, Maybe, lists, and state. With原创 2016-02-21 10:47:12 · 562 阅读 · 0 评论 -
FP中保持纯函数编程ST 1
在FP中最重要的是保持引用的透明性,所以必须纯函数式子编程,在Haskell和scalaz(参考haskell的版本),使用了ST MONAD来方式来确保副作用的安全使用 它使用 S => (S,A)的技巧(很多人把它归为欺骗的技巧'),将可变变量(A)的引用透明化,同时ST确保在组合中(flatmap) tranform monad,确保同一时刻只有一个状态改变,所以确保了read,wr原创 2016-02-21 14:47:52 · 364 阅读 · 0 评论 -
scala之尾递归
上面我们介绍了递归,以及头递归,但是往往在FP中发挥作用的是尾递归,所以我们讲解尾递归,先看前面改造后的def getSum2(list:List[Int]):Int = { def sumHelp(list:List[Int],sum:Int):Int={ if(list == Nil) sum else sumHelp(list.tail, sum + li原创 2015-06-23 19:29:46 · 549 阅读 · 0 评论 -
scala之递归
scala中提供递归的优化如下面的例子中是一个很常见的求和递归scala> def getSum(list:List[Int]):Int = { | if(list == Nil) 0 | else list.head + getSum(list.tail) | }这是一个经典的头递归递归可分为头递归和尾递归对于两者的区分请看点击打开链接很原创 2015-06-23 19:05:52 · 743 阅读 · 0 评论 -
Monads之仿函数
def map[A,B](oa: Option[A])(f: A => B): Option[A]仿函数就是实现了map的数据类型,其签名如上,即接受一个函数将一个类型构造器里的类型转化成另一种类型,我们可以根据这个规则,把‘规则’抽取成一个trait,如下trait Functor[F[_]] {def map[A,B](fa: F[A])(f: A => B)原创 2015-06-22 11:19:49 · 346 阅读 · 0 评论 -
Monads之关系选择器
1.Thesequence and traverse combinators函数的签名def sequence[A](lma: List[M[A]]): M[List[A]]def traverse[A,B](la: List[A])(f: A => M[B]): M[List[B]]实现源码:FP IN Scaladef sequence[A](lma: L原创 2015-06-22 14:10:28 · 385 阅读 · 0 评论 -
Monads之规则
The associative law组合规则FP IN SCALAcase class Order(item: Item, quantity: Int)case class Item(name: String, price: Double)val genOrder: Gen[Order] = for {name <- Gen.nextStringp原创 2015-06-22 14:30:51 · 393 阅读 · 0 评论 -
monoid之含义
monoid在代数里面 The prefix "mon-" means "one"主要三个特性1.包含一种类型A2.接受两个参数A的F,进行操作后并返回类型A3.标识该类型的身份值(我把它理解为进行OP操作类型的底)所以它的traittrait Monoid[A] {def op(a1: A, a2: A): Adef zero: A}例如val string原创 2015-06-22 15:17:44 · 678 阅读 · 0 评论 -
monoid之组合
monoid是允许组合的,而且也是他正真强大的地方(FP IN SCALA 提到),例如A: Monoid[A], B: Monoid[B]可以得出Monoid[B]): Monoid[(A,B)]也是成立的我们使用Monoid的组合组合性来装配一个更加复杂的Monoid----合并键值源码来之FP IN SCALAdef mapMergeMonoid[K,原创 2015-06-22 17:34:08 · 472 阅读 · 0 评论 -
Monads之作用
介绍了几个Monads的属性,但是Monads到底是什么东西,有什么作用?Monads提供了模型,该模型用来绑定数据例如在for中我们用Monads来操作绑定的数据,通过flatMap for { x <- mona("hello ") y <- mona("world!")| } yield x + y...原创 2015-06-22 15:04:18 · 481 阅读 · 0 评论 -
尾递归之认识
在命令式编程中我们很少使用尾递归,多数可以使用for等循环来解决问题,而且尾递归很深时会消耗掉堆栈空间毕竟尾递归比纯粹的Loop难以看出其调用的层数。我们多数是从C中认识尾递归的,像我现在的大学教程中时而不时的会出项尾递归函数的课后题,然而却一直没有沟起我的注意。而且在最常用的Java语言中设计者初衷也不在于尾递归,而在于iteration,然而进入了FP语言后才知道尾递归是何等的重要的Tag原创 2015-06-23 17:24:39 · 434 阅读 · 0 评论 -
scala之尾递归实际用处2
第二题也是自已编的,跟上一题类似,有关系的颗粒处理 val para1 = Map(1->"12",23->"26",6->"63") //key - value有规律,方便观察 val para2 = Map(1->"17",23->"20",0->"09",7->"75") // //result 合并后的结果 //val para M原创 2015-06-23 23:42:17 · 549 阅读 · 0 评论 -
函数类型的数据结构
scala的数据多采用val,所以在数据处理方面采用sharing data的方式处理数据最后才返回结果,例如val a = List(A("a",false),A("b",true),A("c",true),A("e",false),A("f",true))中吧true的数据连接起来case class A(s:String,b:Boolean)object Test exte原创 2015-06-22 19:52:16 · 599 阅读 · 0 评论 -
纯函数状态
上次我们见过java通过改变外界的state实现同一个值不同的结果(Random),那么如何用纯函数做到这个功能?FP IN SCALA中讲道利用(RANG,STATE),就是产生一个值,并且一个唯一的STATE,让后将这个STATE来产生下一个结果FP中的例子trait RNG { def nextInt: (Int, RNG)}将本身作为STATE返回,伴生对象obje原创 2015-06-22 23:48:16 · 532 阅读 · 0 评论 -
从side-effect认识纯函数
纯函数:不改变“外界的值或者说是状态”,对于同一参数都会有同一结果。在java中我们最常用的具有side-effect的非纯函数就是println还有一个常用的side effect的函数就是Random,Random每次依靠不同的state来产生不同的值cala> val rng = new java.util.Randomrng: java.util.Random = java.原创 2015-06-22 23:04:55 · 1696 阅读 · 0 评论 -
scala之尾递归优化
并不是所有的尾递归都被优化的,在scala确实是这样的,所以scala中有一个注释来要求scala编译器务必尾递归优化,如果不行就报错,这个注释是@tailrec看看我们前面的两个例子object DemoTest extends App { def getSum2(list: List[Int]): Int = { @tailrec def sumHel原创 2015-06-23 19:44:33 · 509 阅读 · 0 评论 -
FP中保持纯函数编程ST 2
这里还有作者的一篇文章,配合上一章觉得刚刚好https://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/原创 2016-02-21 14:49:48 · 277 阅读 · 0 评论