Haskell 笔记 ①
①一切都是函数,包括常量、表达式,格式:名字 参数1 参数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这里都是很敷衍的,告诉编译器类型由元素决定,由于a,b不过是临时取的名字
⑧类型类(杂糅了好多东西的大类型接口)
-> (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类型)
用于限定函数参数的类型
Haskell 笔记 ①的更多相关文章
- Haskell 笔记(三)类型系统
类型 (Type) Haskell的类型系统式静态类型系统,在编译的时候就知道数据类型,所以不同类型的值运算在编译的时候就会报错,比如用布尔值和整数运算,在C语言中这种运算就不会报错. Haskell ...
- Haskell 笔记(四)函数系统
函数系统 函数式编程当然少不了函数系统啦,在教程最初的时候就有一个最简单的函数,函数系统贯穿在Haskell全部,Haskell的函数有几个重要的性质. 首先声明一下函数的参数和返回值类型 然后有一个 ...
- Haskell 笔记 ③
①循环?NO!请递归思考问题! 手艹一个求列表中最大值代码,C语言中习惯性for扫一下比较出最大值.但是可以用递归! maximum'::(Ord a)=>[a]->a maximum' ...
- haskell笔记1
haskell platform下载:https://www.haskell.org/platform/ 进入haskell控制台,终端输入 $ ghci 编译文件 :l file.hs 数组操作 & ...
- Haskell 笔记 ②
①如何写一个求阶层函数? fac 0 =1 fac n=n*fac(n-1) 函数自适应匹配参数,可以把特判情况写在前面,注意按顺序匹配的,n这种万能情况写在最前面就完蛋了.同时你也注意到,函数只能一 ...
- haskell笔记2
模式匹配 # haskell_test.hs length' :: [a] -> a length' [] = 0 length' (_:x) = 1 + length' x as模式 xs@x ...
- Haskell复习笔记(一)
Haskell笔记这是第三次总结,前两次都因为各种原因丢失了,对于Haskell我算不上什么大神,只不过在大学时为了学习算法时选择了Haskell. 当时的入门书籍选择的是<Learn You ...
- haskell学习笔记_函数
一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
随机推荐
- Hadoop-2.X HA模式下的FSImage和EditsLog合并过程
补充了一下NameNode启动过程中有关FSImage与EditsLog的相关知识. 一.什么是FSImage和EditsLog 我们知道HDFS是一个分布式文件存储系统,文件分布式存储在多个Data ...
- ZOJ 2136 Longest Ordered Subsequence
#include<time.h> #include <cstdio> #include <iostream> #include<algorithm> # ...
- 三、jQuery--jQuery基础--jQuery基础课程--第5章 jQuery 操作DOM元素
1.使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,attr(属性名,属性值)格式则是设置元素属性名的值. 例如,使 ...
- CLR via C#(17)--接口
CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...
- 重温WCF之发送和接收SOAP头(三)
SOAP头可以理解为一种附加信息,就是附加到消息正文的内容. 既然消息头是附加信息,那有啥用呢?你可别说,有时候还真有不少用处.举个例子,WCF的身份验证是不是很麻烦?还要颁发什么证书的(当然不是荣誉 ...
- 拷贝,集合,函数,enumerate,内置函数
1.拷贝 字符串和数字.赋值 id一样 import copy #提供拷贝功能 copy.copy() #原来的和现在的一起修改,不用修改时用浅copy,节省内存,复制最外层 copy.deepcop ...
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- win7Java开发环境配置
win7下Java开发环境的配置 首先下载符合操作系统版本的jdk,比如最新的jdk8: 下载链接:http://www.oracle.com/technetwork/java/javase/down ...
- 使用.NET Framework的配置文件app.config
在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的hard code,我们都在config中添加许多配置信息,一般可以选择.NET自带的配置文件形式app.config或者web项目中的 ...
- 攻城狮在路上(壹) Hibernate(一)--- 软件环境、参考书目等一览表
1.环境配置: web容器:tomcat6.0 JDK:1.7.0_51 hibernate:4.2.0.Final 操作系统:WIN8 64位 数据库:mysql Ver 14.12 Distri ...