18

Click here to load reader

とりあえず使うScalaz

Embed Size (px)

Citation preview

Page 1: とりあえず使うScalaz

とりあえず使うScalaz2014/12/11

Shuya Tsukamoto

Page 2: とりあえず使うScalaz

Basic info

Page 3: とりあえず使うScalaz

Scalaz

https://github.com/scalaz/scalaz

Page 4: とりあえず使うScalaz

Scalaz (Functional Programming) is hard.

MonadFunctor

Applicative

Category theory(圏論)

Lambda

Monoid

Applicative Builder

Semigroup

Page 5: とりあえず使うScalaz

Scalaz is …

Page 6: とりあえず使うScalaz

Scalaz is …

Page 7: とりあえず使うScalaz

Scalaz is …Library!!!

Page 8: とりあえず使うScalaz

How to use with REPLwget http://repo1.maven.org/maven2/org/scalaz/scalaz-core_2.11/7.1.0/scalaz-core_2.11-7.1.0.jar !scala -cp scalaz-core_2.11-7.1.0.jar !scala> import scalaz.Scalaz._ import scalaz.Scalaz._ !scala> val someString = "abc".some someString: Option[String] = Some(abc) !scala>

Page 9: とりあえず使うScalaz

How to use with SBT

libraryDependencies += "org.scalaz" % "scalaz-core_2.11" % "7.1.0"

Page 10: とりあえず使うScalaz

Simple functions

Page 11: とりあえず使うScalaz

Option extension• .option, .some, none[T]import scalaz.Scalaz._ !object Main extends App { // pure scala val a = "abc".some println(a) // Some(abc) ! // scalaz val b = Some("abc") println(b) // Some(abc) }

Page 12: とりあえず使うScalaz

Option extension• .option, .some, none[T]import scalaz.Scalaz._ !object Main extends App { // pure scala val a = "abc".some println(a) // Some(abc) ! // scalaz val b = Some("abc") println(b) // Some(abc) }

pipeline(chain style) readable

Page 13: とりあえず使うScalaz

Option extensionimport scalaz.Scalaz._ !object Main extends App { val a = longChaingFunction1.longChaingFunction2 .longChaingFunction3.longChaingFunction4 .longChaingFunction5.some val b = Some(longChaingFunction1.longChaingFunction2 .longChaingFunction3.longChaingFunction4 .longChaingFunction5) }

Page 14: とりあえず使うScalaz

DListimport scalaz.DList !object Main extends App { ! var dList = DList[String]() ! dList :+= "one" dList :+= "two" dList :+= "three" ! println(dList.toList) // List(one, two, three) }

Difference lists: a data structure for `O(1)` append on lists.

Page 15: とりあえず使うScalaz

DList• ScalaのListとListBufferとScalazのDListで要素追加したときの速度http://tsukaby.com/tech_blog/archives/662

append O(1) !!!!

OMG!

Page 16: とりあえず使うScalaz

Validation[+E, +A]import scalaz._ import scalaz.Scalaz._ !object Main extends App { // Left : Failure, Right(Correct!) : Success val result:Validation[String, Int] = getCurrentYear() ! result match { case Success(a) => println("Year:" + a) case Failure(e) => println("Error:" + e) } def getCurrentYear(): Validation[String, Int] = { 2014.success //"Can't get year.".failure } }

Page 17: とりあえず使うScalaz

Validation[+E, +A]sealed abstract class Validation[+E, +A] extends Product with Serializable !final case class Success[A](a: A) extends Validation[Nothing, A] final case class Failure[E](e: E) extends Validation[E, Nothing]

!

※next step(ValidationNel, ApplicativeBuilder)

Page 18: とりあえず使うScalaz

ImmutableArrayimport scalaz.ImmutableArray !object Main extends App { val mutableArr = Array(1, 2, 3) mutableArr.update(0, 999) println(mutableArr(0)) ! val immutableArr = ImmutableArray.fromArray(Array[Int](1, 2, 3)) // immutableArr.update // compile error println(immutableArr(0)) }