zoukankan      html  css  js  c++  java
  • 初识Haskell 二:基本操作符、类型Type、数据结构

    Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结。环境Windows


      编译器

    1. 在安装了ghci后,便可以进行Haskell的编译,点击GHCi 即可在命令行中打开ghci,也可点击WinGHCi,也可直接在命令行中ghci进入交互式编译器。

                                                        直接在命令行中输入ghci进入

     2.  :?  显示操作命令(注意有“ : ”),常用操作有:

        :cd  进入指定路径

        :load 载入文件

        :quit  退出ghci

     3.Haskell使用缩进(indentation)来表示上一行的续写。单行注释符号--       块注释 {-     -}


     类型Type

      Integer和Int

      两者均表示整数,区别在于:Int的范围为电脑存储一个字(word)的大小,是有限的。Integer是数学意义上的整数,理论上是无限大的,和电脑内存有关。若在计算时结果会超出Int的范围,则在表达式上用 ::Integer 表示为Integer类型,但实际上目前的gchi似乎是当超出Int时,自动用Integer类型表示,不用标明,但超出Int的结果用Int类型表示则显示为0

     

    Float:单精度浮点数single-precision floating point numbers & Double:双精度浮点数double-precision numbers

    浮点数在Haskell中是非精确表示的(当然其他语言也是),比如0.11 - 0.10 和 2.11 - 2.10的结果理应一样,但在Haskell中则不一样(也与电脑有关)

    所以需要注意的是当比较两个浮点数时,是比较其差值的绝对值是否小于一定范围(within an acceptable error tolerance)。

     Ratio Integer:精确表示有理数

    因为有理数都可以表示为分数的形式,Haskell用分子(numerator)%分母(denominator)的形式表示有理数。使用前需要import Data.Ratio

         

    Bool:布尔值

    Char:字符类型

    用单引号(single-quote)将字符包起,如 'a'。注意与表示中间操作符的反引号(back-quote)区分,'?'是Char,`div`是操作符。还有' '为换行符(newline),当被打印时会换行。需import Data.Char才能使用。

    String:字符串

    String是0个或多个字符的组合,用双引号(double-quote)包起,'a' 和 "a"的区别在于前一个是字符a,后一个是一个包含了字符a的字符串。

     


     基本数据结构

      元组 tuple

    元组是将一系列数据值(可以是0个,但不可以是1个!)以逗号分隔放在括号里,可以是不同的类型,如(2, "dog")是1个2个元素的元组,它的类型是(Int, String)。一个元组有n个元素,则成为n-tuple,2-tuples常被叫做pairs,有0-tuple,写作(),用来作为假值(dummy value),但没有1-tuple

    列表 list

    List是函数式语言中最常用的数据结构,相当于C中的数组,以中括号 [ ] 表示,以逗号 , 分隔,存储一系列相同type的数据(也可以是list of tuples),如[1, 2, 3]是a list of integers。List可以存储任意数量的元素(可以是0个即[ ]),但元素必须是同一类型的,如:

    [13, 9, -2, 100] :: [Int]

    ["cat", "dog"] :: [String]

    [[1, 2], [3, 7, 1], [ ], [900]] :: [ [Int] ]

    字符串String实际上就是字符Char的list,"abc" 与['a', 'b', 'c']是相同的。

    表示一系列数字或字符时,可以只写开头1个或2个和最后1个,中间用 .. 代替,如果只写开头1个,默认增量为1,写2个则以差值为增量。如:

      

     : 用于将新元素添加到list的首部,发音为cons(because it constructs a list),注意 : 前面的是元素,后面的是列表。示例:

    1:[2, 3] => [1, 2, 3]

    1:[ ] => [1]

     所有的list都是由空list[ ]用 组成的,其实[1, 2, 3]这种写法只是list一个更好看的语法表达而已,写成 (1:(2:(3 : []))) 或者去掉括号 1: 2: 3: []也是一样的。

    Haskell提供了一系列特色使得list易于使用,列表解析list comprehension让使用者直接定义list而不用写程序去建造它们,其基于数学集合的定义形式像{ x2 | x ∈ S},基础的列表解析是由一个表达式和生成器generator构成的:

    [expression | generator]

    有generator指明了一系列要被带进左边的表达式中的值,形式是var <- list,如:

        <-右边的如果是list of tuples的话,var则变成了a tuple of variables来对应,则可以有:

        

        zWith f xs ys = [(f x y) | (x, y) <- zip xs ys]

     可以有多个generator,但操作类似与多重循环,且后面的generator可以建立在前面的generator上。

    如果不想多重循环而只想一一对应(其实相当于zipWith)的话,可以:

    [(x, y) | (x, y) <- zip [1, 2, 3] [3, 4, 5]]

    generator还可以添加限制条件filter,filter是一个Bool类型的表达式,当从generator取出一个值时,若表达式值为False则扔掉,取下一个值。

     


     

    操作符operator:

      二元操作符其实也是函数,但放在参数前要加(),如:

      

      :: operator   指明该表达式的类型read it as has type,如2::Int says 2 has type Int

      + 加 addition

      - 减 subtraction

      * 乘 multiplication

      / 除 division 如5/2 => 2.5

      ^ 幂函数 exponentiation

      ** 浮点数幂函数the floating point exponentiation,如 2**0.5=>1.41421

      == 布尔类型操作符 等于

      /= 布尔类型操作符 不等于

      <  布尔类型操作符 小于

      <= 布尔类型操作符 小于等于

      > 布尔类型操作符 大于

      >= 布尔类型操作符 大于等于

      && 布尔类型操作符 与

      || 布尔类型操作符 或

      not 布尔类型操作符 非

      ++ 字符串操作符 用于连接连个字符串,如 "abc" ++ "def" => "abcdef" 


     常用函数functions:函数名+空格+表达式即可,不用括号,当然在嵌套时要括号。

    二元函数表示时,若放在元素的前面则直接打出,如div 5 2,若放在中间(二元函数)则要用反引号(back-quote,和~一个键,数字键1的左边)表示,如 5 `div` 2。

    div 整除 如 div 5 2 或 5 `div` 2结果为2

    mod 求余

      max 求两者中的较大值 如max 3 8 => 8

      min  求两者中的较小值 如min 3 8 => 3

      toUpper 返回该字母的大写形式,需要import Data.Char

      toLower 返回该字母的小写形式,需要import Data.Char

    length 返回该字符串的长度

      fst 返回二元元组的第一个元素,如fst (1, 'a') =>1

      snd 返回二元数组的第二个元素,如snd (1, 'a')=>'a'

  • 相关阅读:
    session机制、cookie机制
    TCP报头格式
    python中with语句的使用
    html一些东东
    jquery 几点注意事项
    C# 一些小东东
    Microsoft Jet 数据库引擎找不到对象'Sheet1$_'。请确定对象是否存在,并正确地写出它的名称和路径
    DataTable Select查询
    js求指定时间的周一和周日
    asp.net 页面执行过程
  • 原文地址:https://www.cnblogs.com/Will-zyq/p/10303111.html
Copyright © 2011-2022 走看看