zoukankan      html  css  js  c++  java
  • Haskell 笔记 ①

    一切都是函数,包括常量、表达式,格式:名字 参数参数2.. =函数内容

    if语句(else绝对不可以省略)

    F=if (..) then x

      else y

    没有数组,只有列表[1,2,3,4,5], [‘h’,’e’]

      列表有好多运算符:

      “++” :同类型拼接

      “ : “ :前端插入,1:2:3:4:5:[]等效于[1,2,3,4,5],后端插入请用++

      “!!”: 下标索引,从0开始,[1,2,3]!!1=2

      列表是可以嵌套的[[1,2],[3,4]]

      列表是可以比较的[1,2,3]<[1,3]

      列表有一些常用函数,注意这些混乱的名字

      head []:返回首元素

      last []: 返回尾元素

      tail []:返回去除头元素后的列表

      init []:返回去除尾元素后的列表

      null []:检测是否空

      reverse []:反转

      take/drop 5 []:/扔列表前5个元素

      maximum/minimum []: 最值

      sum/product []:和与积

      elem 4 [1,4]: 是否存在,通常中缀形式,即 4 `elem` [1,4]

    列表可以自由推导,最好不要去推导浮点数(精度问题)

      [1..20]就是1~20了,[‘a’..’z’]就是a~z

      只要告诉步长就可以自由推导,如[1,4..11]=[1,4,7,11]

      注意20~1应该这么写[20,19..1],因为默认的等差推导认为d>0

      列表是惰性的。

      [1,4..]尽管是无限的,但却是合法的,你可以take 5 [1,4..]取出前5项,要多少算多少,Lazy

      相关惰性函数(注意格式!!)

      take 5 (cycle [1,2,3]) //生成123循环列表

      take 5 (repeat 5) //生成5循环列表

    万能的列表表达式

      还记得高中学集合时,描述型表示集合么 {x|x<10,x-(N}

      看这个例子[x|x `mod` 3==1,odd x],这个就是给定一堆条件创造的列表,所有条件逗号隔开,且都是逻辑与关系,返回的不仅可以是x, x*y也行,(x,x)也行

     列表表达式可以是函数(Orz

     看这个函数fuck xs=[x|x `mod` 3==1,odd x],调用时fuck [1..10]

    列表表达式可以嵌套

    [ [x|x<-xs]|xs<-xxs] ,当然xxs就得是嵌套列表

    细胞数组?元组!

    (1,”hello”,”a”) ,用C语言来解释原理,就是建了个结构体。

    列表套元组,元组的形式(个数&类型)必须一致,因为列表中的类型必须一致,一个元组就是一个结构体,一种限定的类型

    二元组别称序对,有三个函数fst/snd,取第一/第二元素,zip [1..20] [20..30]zip就是拉链的意思,自动从两个列表中生成[所有序对],长度由最短那个控制

    ⑦关于类型的那点事

    检测类型表达式: “:t” , :t 4==5则输出4==5::BOOL,其中::负责指明类型

    来看下一个完整优美的函数写法

    add::Int->Int->Int->Int(忽略这句也没问题,但是编译器会给警告)

    add x y z = m

    类型声明格式1,2..返回值,中间用箭头连接,表示“函数推导”之意

    常见类型:Int,Char,Bool,Float,Double,Integer(大整数,2333!),String

    虚类型:t head的返回结果是 head::[a]->a, :t fst则是fst::(a,b)->a

    a,b这里都是很敷衍的,告诉编译器类型由元素决定,由于ab不过是临时取的名字

    ⑧类型类(杂糅了好多东西的大类型接口)

    -> (Eq a)与(Ord a)写函数类型时强制前置说明,如果函数里涉及==/=, <>

    比如手艹一个min函数

    min'::(Ord a)=>a->a->a

    min' a b= if(a<b) then a

          else b

    ->有一些功能类型类(Show类型和Read类型)

      函数show:把任意类型值变成字符串,如show Ttrue=”True”

      函数read: 把字符串通过类型推导还原类型,需要借助一个运算来推导类型

      如,Read “[1,2]”+[3]=[1,2,3],直接写Read “[1,2]”是不对的

    ->有一些你看不到(Enum类型)

      还记得列表[1..20]这个列表就是Enum类型了,succ/pred函数查看推导的后继/前驱

    ->有一些专门打辅助(Bounded类型)

      函数minBound::Int, maxBound::Int,检查类型的上下界

    ->普通类型总结一下(Num类型,Floating类型,Integer类型)

      用于限定函数参数的类型

  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/neopenx/p/4273486.html
Copyright © 2011-2022 走看看