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 else、patter match也都是表达式。 expressions 总是返回结果,几乎不产生任何side effect;相反,statements 并不返回任何结果,仅仅为了获取side effect而执行。 EOP(expression-oriented programming)是函数式编程语言的共有特点,更多内容请参考这里。 通过EOP,代码变得:
easy to reason about
easy to test
excute in parallel
Function
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?