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类型)

  用于限定函数参数的类型

原文地址:https://www.cnblogs.com/neopenx/p/4273486.html