• 深入浅出Scala之函数式编程、静态类型语言(P4-P9)


    1.函数式编程

    函数式编程是一种"编程范式” (programming paradigm),也就是如何编写程序的方法论。
    函数式编程是一种“编程范式”(编程范例),也就是如何编写程序的方法论。

    纯粹的函数式编程语言编写的函数没有变量,因此,任意-个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

    函数式编程的特点:

    • 函数是一等公民
    • 以表达式为中心
    • 无副作用

    副作用含义:一个带有副作用的函数不仅有一个返回值,还可能做了修改一个变量,直接修改数据结构,设置-一个对象的成员,打印到终端或者读取用户输入,读取或写入一个文件,在屏幕上绘画,抛出一个异常或以一个错误终止;一个函数在程序执行过程中除了根据输入参数给出运算结果外,没有其他的影响,就称为没有副作用的。

    • 不修改状态
    • 引用透明

    函数式编程优势:

    • 代码简洁,开发速度快
    • 接近自然语言,易理解
    • 易于代码管理
    • 适合并发编程
    • 适用于热升级
    • 函数式编程的一个特点就是,函数也是值,同允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

    2.静态语言和动态语言

    静态编译语言:实现声明变量类型,类型不能改变,编译时检查;
    动态编译语言:不用事先声明类型,随时可以赋值为其他类型,编程时不知道什么类型,很难推断;
    静态语言和动态语言关键区别是何时获得类型信息,是在编译时间还是运行时间。

    3.强类型于弱类型语言

    强类型语言:不同类型之间操作,必须强制类型转换为同一类型,print(‘a’+1):
    弱类型语言:不同类型间可以操作,自动隐式转换。
    强类型和弱类型语言的区别关键是类型之间的区别是否严格,例如语言是否会做字符串类型到数字类型的隐式转换。

    • eg:
    //弱类型语言vbs
    a=1
    b=a+"1"+"a";//11a,这里a成了字符串
    c=a+1//2,这里a则是int
    
    //强类型语言c++
    int a=2;
    string b=std::to_string(a),+"1";
    int c=a+1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.scala资料

    官网+资料;
    《快学scala》;
    《Programming in Scala》;

    5.Linux scala环境配置

    ubuntu20.04

    sudo apt install scala
    
    • 1

    6.Scala解释器的使用

    REPL: Read (取值)I-> Evaluation (求值) > Print (打印) > Loop (循环)。

    • scala解释器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM来执行。

    计算表达式:在scala>命令行内, 键入scala代码, 解释器会直接返回结果给你。

    • 如果你没有指定变量来存放这个值,那么值默认的名称为res,而且会显示结果的数据类型,比如Int, Double, String等等。
    wangji@DESKTOP-9TAUMH9:~$ scala
    Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 11.0.17).
    Type in expressions for evaluation. Or try :help.
    
    scala> 1+1
    res0: Int = 2
    
    scala> res0
    res1: Int = 2
    
    scala> print(res1)
    2
    scala> for(i <- 1 to 2) print
    <:<                 RichException         char2Character               locally        refArrayOps
    =:=                 SeqCharSequence       charArrayOps                 long2Long      require
    ???                 Set                   charWrapper                  longArrayOps   seqToCharSequence
    ArrayCharSequence   Short2short           classManifest                longWrapper    short2Short
    ArrowAssoc          String                classOf                      manifest       shortArrayOps
    Boolean2boolean     StringCanBuildFrom    conforms                     optManifest    shortWrapper
    Byte2byte           StringFormat          double2Double                print          tuple2ToZippedOps
    Character2char      Triple                doubleArrayOps               printf         tuple3ToZippedOps
    Class               any2ArrowAssoc        doubleWrapper                println        unaugmentString
    ClassManifest       any2Ensuring          error                        readBoolean    unitArrayOps
    Double2double       any2stringadd         exceptionWrapper             readByte       unwrapString
    DummyImplicit       any2stringfmt         fallbackStringCanBuildFrom   readChar       wrapBooleanArray
    Ensuring            arrayToCharSequence   float2Float                  readDouble     wrapByteArray
    Float2float         assert                floatArrayOps                readFloat      wrapCharArray
    Function            assume                floatWrapper                 readInt        wrapDoubleArray
    Integer2int         augmentString         genericArrayOps              readLine       wrapFloatArray
    Long2long           boolean2Boolean       genericWrapArray             readLong       wrapIntArray
    Manifest            booleanArrayOps       identity                     readShort      wrapLongArray
    Map                 booleanWrapper        implicitly                   readf          wrapRefArray
    NoManifest          byte2Byte             int2Integer                  readf1         wrapShortArray
    OptManifest         byteArrayOps          intArrayOps                  readf2         wrapString
    Pair                byteWrapper           intWrapper                   readf3         wrapUnitArray
    
    scala> for(i <- 1 to 2) println(i)
    1
    2
    
    scala> res1.to
    to               toByte   toDegrees   toFloat       toInt    toOctalString   toShort
    toBinaryString   toChar   toDouble    toHexString   toLong   toRadians       toString
    
    scala> res1.to
    
    def to(end: Float): Range.Partial[Float,scala.collection.immutable.NumericRange[Float]]
    def to(end: Double): Range.Partial[Double,scala.collection.immutable.NumericRange[Double]]
    def to(end: Double,step: Double): scala.collection.immutable.NumericRange.Inclusive[Double]
    def to(end: Long,step: Long): scala.collection.immutable.NumericRange.Inclusive[Long]
    def to(end: Long): scala.collection.immutable.NumericRange.Inclusive[Long]
    def to(end: Int,step: Int): scala.collection.immutable.Range.Inclusive
    def to(end: Float,step: Float): scala.collection.immutable.NumericRange.Inclusive[Float]
    def to(end: Int): scala.collection.immutable.Range.Inclusive
    
    scala> res1.toDouble
    res4: Double = 2.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    7.集成开发环境配置

    (1)仅使用scala以及scalac

    • helloworld.scala
    object  helloworld{
        def main(args: Array[String]): Unit ={
            println("helloworld");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译以及运行

    mkdir class
    scalac -d class helloworld.scala
    cd class;scala -classpath . helloworld
    
    • 1
    • 2
    • 3

    (2)使用vscode以及sbt的方式

    配置sbt仓库最新方案见:官网

    scala以及sbt的安装,参照我的方法去安装即可
    sbt安装方法1:参考:在 Linux 上安装 sbt

    ubuntu系统:
    
    echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list
    echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list
    curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add
    sudo apt-get update
    sudo apt-get install sbt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    sbt安装方法2:

    ubuntu安装sbt:
    echo “deb https://dl.bintray.com/sbt/debian /” | sudo tee -a /etc/apt/sources.list.d/sbt.list
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
    sudo apt-get update
    sudo apt-get install sbt

    • 问题:Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead
    wangji@DESKTOP-9TAUMH9:~/packets$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
    Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
    Executing: /tmp/apt-key-gpghome.csxhD98teu/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
    gpg: key 99E82A75642AC823: "sbt build tool " not changed
    gpg: Total number processed: 1
    gpg:              unchanged: 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考下面的链接,可知key:642AC823

    apt-key export 642AC823|sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/sbt.gpg
     
    同时修改
    wangji@DESKTOP-9TAUMH9:~$ vim /etc/apt/sources.list.d/sbt.list
    deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/sbt.gpg] https://dl.bintray.com/sbt/debian /
    
    
    结果:可以看到增加key成功
    wangji@DESKTOP-9TAUMH9:~/packets$ apt-key list
    Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
    /etc/apt/trusted.gpg
    --------------------
    pub   rsa4096 2015-05-29 [SC]
          2EE0 EA64 E40A 89B8 4B2D  F734 99E8 2A75 642A C823
    uid           [ unknown] sbt build tool <scalasbt@gmail.com>
    sub   rsa4096 2015-05-29 [E]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    在~/.sbt下面创建repositories文件,内容如下:
    
    [repositories]
    local
    osc: https://maven.aliyun.com/nexus/content/groups/public/
    typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
    sonatype-oss-releases
    maven-central
    sonatype-oss-snapshots
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用sbt

    8. Scala编码规范

    文件名和编码

    • 源文件名必须和它包含的顶层类名保持一致,包括大小写,并以.scala作为后缀名。
    • 所有源文件编码必须是UTF-8

    特殊字符
    空格

    • 除了换行符之外, ASCII空格(0x20) 是唯一合法的空格字符。 这意味着所有在源代码中(包括字符、字符串以及注释中)出现的其他空格字符需要转义,例如Tab用\t表示。
    • 缩进必须使用4个空格而不是Tab

    特殊转义字符

    • 对于有特殊转义表示的字符\b, \t, \n, \f, \r, \", \', \\.禁止使用其它等价转义方式。例如\012或者\u00a表示。

    非ASCII字符

    • 对于非ASCII字符,可以使用实际字符(如)或者它的Unicode转义(如\u221e) , 取决于哪种写法的可读性
      更好。
      使用注释有助于增强可读性

    scala中简单表达式可以省略括号

    //推荐
    def square(x: Int) = x*x
    val y= if (x < 0) -x else x
    if (cond1)
    {
    	//ont line statement
    }
    else
    {
    	//ont line statement
    }
    
    
    
    //避免
    if (x < 0)
       -x 
     else
     	x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    命名规范
    基本原则:驼峰法,命名具有业务含义

    • 类名:首字母大写
    • 变量名:首字母小写
    val orderName= "name"
    
    • 1
  • 相关阅读:
    sublime 3 for mac安装与使用
    精选20个爆火的Python实战项目(含源码),直接拿走不谢
    推荐系统-排序层-2018:ESMM【多任务学习模型】【多任务学习(multi-task learning,简写MTL)】【阿里】
    【华为OD机试真题 python】数据分类【2022 Q4 | 200分】
    统计学习算法实现(01)——决策数
    【面经】被虐了之后,我翻烂了equals源码,总结如下
    Win11如何更改默认下载路径?Win11更改默认下载路径的方法
    Java面试题及答案整理(2022最新版)
    想开发DAYU200,我教你
    git-新增业务代码分支
  • 原文地址:https://blog.csdn.net/u011436427/article/details/127860255