Haskell 笔记 ②

如何写一个求阶层函数?

fac 0 =1

fac n=n*fac(n-1)

函数自适应匹配参数,可以把特判情况写在前面,注意按顺序匹配的,n这种万能情况写在最前面就完蛋了。同时你也注意到,函数只能一行写完,不能智能识别作用域啊!!

②灵活的使用你的函数参数!

看这个求三元组第三个值的函数,占位符_的神奇使用。

third::(a,b,c)->c

third (_,_,c)=c

更神奇的手艹head函数, (x:_)中占位符模拟出了列表的剩余部分

head’::[a]->a

head’ (x:_) =x

若是固定长度的列表,可以这么写head’ (x:y:[] ) =x 或者 head [x,y]=x

③As模式(填坑中,看不懂)

④利用哨位(Guard)写出一个优美的递归程序, | 后面的那个布尔式叫哨位

fac n

| n==1 = 1

| n==2 = 2

|otherwise =n*fac(n-1)

尽管函数式语言不允许全局变量存在(全局就变成函数了,函数是确定,不可修改的)但是一个函数的尾部可以用where开设一个只赋值一次且作用域只是本函数的变量区,方便值一次计算多次,重复使用,用完销毁,变量区的变量必须对齐了,不然编译错。

fac n

| n==1 = x

| n==2 = y

|otherwise =n*fac(n-1)

where x=n*2

y=n*3

where的一次赋值特性其实表明它本体就是个函数,所以支持函数的匹配特性

where (f:_)=”2333”

(s:_)=”3223”

⑤where的老婆let?

我们知道let可以定义一个常量(函数),函数中let更是where的好妻子,其实它们就是倒过来而已。

看这个代码:

f length width height=

let s=length*width

in v=s*height

先开变量区,最后in进行表达式求值。

俗话说女人拥有社会最高权力,let..in 可以脱离函数使用,求个值~

let还支持分号和逗号,挤空间什么的。

let a=1;b=2;c=3 in a+b+c,let d=4 in a+b+c+d

列表表达式的条件区也可以写let,不过此时let式子不是过滤,而是计算作用了

f xs=[ans|x<-xs,let ans=x^2]

时间: 2024-10-25 21:52:06

Haskell 笔记 ②的相关文章

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]

Haskell 笔记 ③

①循环?NO!请递归思考问题! 手艹一个求列表中最大值代码,C语言中习惯性for扫一下比较出最大值.但是可以用递归! maximum'::(Ord a)=>[a]->a maximum' []=error "empty!" maximum' [x]=x maximum' (x:xs) = max x (maximum' xs) 同样的对列表的递归技巧可以手艹出take.reverse.repeat.zip rev::[a]->[a] rev []=[] rev (x:

Haskell语言学习笔记(64)Lens(4)

Prisms data NewTask = SimpleTask String | HarderTask String Int | CompoundTask String [NewTask] deriving (Show) makePrisms ''NewTask *Main> a ^? _SimpleTask Just "Clean" *Main> b ^? _HarderTask Just ("Clean Kitchen",15) *Main>

Real World Haskell学习笔记02

数据结构 List 像是C里的数组,只能存相同类型的数据 两个基本操作++和:,++用于连接两个list当然两个list的值必须类型相同,:是cons,用于构造列表,第一个元素必须是值,不能是列表 字符串 可以看到上下结果完全相同,"表示字符,""表示字符串,和C用指针数组表示字符串一样,haskell的字符串是字符的list,所以list的所有操作都可以用在字符串上 类型 haskell会进行类推导 :set +t可以显示输出结果的类型,使用:unset +t可以关闭输出类

Haskell 趣学指南 入门笔记(二)

显示类型声明,Haskell是不用定义类型的原因,很像python 想要确定某个表达式的类型 1 *Main> :t 'a' 2 'a' :: Char 3 *Main> :t True 4 True :: Bool 5 *Main> :t "HELLo" 6 "HELLo" :: [Char] 可以用:t 显示 所以当我们定义一个函数时,可以加上类型声明. body.hs函数 addthree::Int -> Int ->Int -&

Haskell 趣学指南 入门笔记(一)

废话少说.正题 什么是函数式语言,我的初步理解是:以函数为主导,函数构成函数. 现在编译器,后缀为.hs 跳过下载安装那部分. 我是windows 系统下 我自己又找了一个带图形界面的编辑器:winGhci http://www.softpedia.com/get/System/Launchers-Shutdown-Tools/WinGhci.shtml 挺简洁的 有点类似python自带的那个 Haskell 函数为主体: succ 是指下一个. 最奇怪的事 min ,max函数居然 可以不要

Haskell学习笔记二:自定义类型

内容提要: 代数数据类型 - Algebraic Data Types: 自定义数据类型 - data关键字:值构造器:类型变量与类型构造器: 记录(Record)语法 - 简化自定义数据类型的一种语法糖: 一个完整的例子 - PurchaseOrder定义和简单计算.单元测试: 代数数据类型(Algebraic Data Types) 为什么Haskell的数据类型会有代数数据类型这个名字?回想我们初中时代,初次学习代数的情况,印象最深刻就是x,y,z代替了具体的数字,引入方程式的概念,对 解

Haskell学习笔记一:类型和类型类相关内容

内容提要: 静态类型系统: 编译时确定类型错误: 类型推导机制: 基础类型:Int,Integer,Float,Double,Bool,Char: 类型变量: 基础类型类:Eq,Ord,Show,Read,Enum,Bounded,Num,Integral,Floating: Haskell是一门函数式编程语言,被称为最为纯粹的函数式编程语言.Haskell的类型系统非常强大,其中包含了很多有趣.抽象.某种程度上充满学术气息的特质. Haskell属于静态类型语言,这意味着: 每个值或者表达式,

haskell 乱搞笔记[原创]

脑洞时间:为什么世界上有那么多程序语言,那是腐朽的资本主义为了增加广大人民学习成本以及编译原理太过普及造成的,建议大学取消编译原理的一切课程,并挥起奥姆休的剃刀,把所有程序语言统统踢了,除机器语言外只留下两种语言:汇编和haskell(逃 简明扼要的写一点haskell 好玩的东西 首先是一些基本操作,命令行按ghci进入,一些基本操作前面用冒号,用惯vim的人应该很熟悉,比如 :quit 退出 :t 显示变量的类型(char,int之类的) :l 链接外面写好的函数文件,事实上这种模式不能自己