README-CN

A tutorial for Functional programming in Scala

Setup

安装Java 8 JDK

打开terminal,检查版本

如果没有安装,请在这里下载

安装sbt, 0.13.13或更高版本

Mac OSX 使用brew进行安装:

Linux 安装:

TODO

Hello world with sbt

sbt 0.13.13 增加了new命令,可以根据模块创建Scala项目。

根据提示信息,输入你的项目名,完成项目的创建:

现在我们已经有了一个最基本的项目,查看目录结构:

  • build.sbt, 项目的构建文件,包含了项目的基本信息。

  • project, 本目录中包含了项目构建过程所依赖的第三方插件等。

  • src, 代码包括测试代码的源文件目录。sbt代码管理风格和Maven一致。

修改源代码,将src/main/scala/example/Hello.scala,其中一行修改为:

通过sbt运行程序有两种方式,直接通过sbt run运行;或者执行sbt进入交互REPL模式,再执行run。输出:

Ctrl + d 或输入exit退出sbt。

REPL

REPL (Read-Eval-Print Loop)是编程语言的交互执行环境,可以通过下面两种方式进入Scala的REPL:

  • sbt console

  • amm

    其中amm是第三方REPL工具,支持语法高亮、代码复制等用户友好的操作。通过如下命令进行安装:

Basics in Scala

本文包含一些基本的语法和概念,如常量、变量、表达式、函数等。可以通过REPL进行练习,增加对语法的熟悉。

val vs var

通过val, 可以将表达式的结果赋值给一个常量,常量值不能改变。

var定义的值为变量,可被修改。

Expression

Scala中几乎所有的语句都是表达式,就连if elsepatter match也都是表达式。 expressions 总是返回结果,几乎不产生任何side effect;相反,statements 并不返回任何结果,仅仅为了获取side effect而执行。 EOP(expression-oriented programming)是函数式编程语言的共有特点,更多内容请参考这里。 通过EOP,代码变得:

  • easy to reason about

  • easy to test

  • excute in parallel

Function

Functions vs Methods

Common data structure

List:

Set:

Seq:

Map:

Stream:

Scala类型系统:Parameterized Types 和 Variances

Why variance

Scala中集合是covariance,我们可以使用子类集合替换父类集合。例如,List[Circle]可以用于任意需要一个List[Shape]的地方,因为Circle是Shape的子类。

Contravariance, 当构造代表一些操作的类型时,十分有用。如JsonWriter type class:

JsonWriter[Shape]是JsonWriter[Circle]的子类,也就是所,任何使用shapeWriter的地方可以用circleWriter替换。 那么我们的circle就可以和任意一个writer结合使用。

Common used libraries

Cats

常用的Monad

Id

Either

Eval Manad

Eval有三个子类型,Now、Later和Always。

通过value方法进行取值。

Eval和Scala lazy的比较:

scala

cats

properties

val

Now

eager, memoized

lazy val

Later

lazy, memoized

def

Always

lazy, not memoized

Writer

State

Custom Monad

通过实现flatMap, pure, tailRecM为一个自定义的类型提供Monad。

Monad transformer

Cats为很多Monad提供了transformer,以T结尾,如:EitherT是Either和其他Monad组合,OptionT组合Option和其他Monad。

Validated

  • map, leftMap, bimap

  • toEither

  • withEither

  • ensure

Http4s

HTTP applications are jsut a Kleisli function from a streaming request to a polymorphic effect of a streaming reponse.

https://rossabaker.github.io/boston-http4s/

Circe

Shapeless

Function1:

Natural Transformation:

References

[1] https://blog.codecentric.de/en/2015/03/scala-type-system-parameterized-types-variances-part-1/

Last updated

Was this helpful?