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]
⑥简便而灵活的case .. of
C语言中的swich/case用法,不过这里的使用更加灵活,其实就是按顺序的模式匹配
f::String->String
f str = "hello" ++ case str of "world" ->" world"
"fuck"->" bi~"
""->" none"
还记得where不?前面说where开辟的其实就是一块函数区,那么这里可以这么改写, YY个what函数而不用考虑类型。
f::String->String
f str = "hello" ++ what str
where what "world"=" world"
what "fuck"=" ~bi"
what ""=" none"
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 笔记 ①
①一切都是函数,包括常量.表达式,格式:名字 参数1 参数2.. =函数内容 ②if语句(else绝对不可以省略) F=if (..) then x else y ③没有数组,只有列表[1,2,3,4 ...
- 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 ...
随机推荐
- 20145206《Java程序设计》第9周学习总结
20145206 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作 ...
- JavaScript基础——处理字符串
String对象是迄今为止在JavaScript中最常用的对象.在你定义一个字符串数据类型的变量的任何时候,JavaScript就自定为你创建一个String对象.例如: var myStr = &q ...
- 三、jQuery--jQuery基础--jQuery基础课程--第10章 jQuery UI型插件
1.拖曳插件——draggable 拖曳插件draggable的功能是拖动被绑定的元素,当这个jQuery UI插件与元素绑定后,可以通过调用draggable()方法,实现各种拖曳元素的效果,调用格 ...
- AJAX XML返回类型
例题 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- JavaScript 火花效果
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- .net学习之CTS、CLS和CLR
CLR:公共语言运行时,就是所有.net语言写的程序的公共运行时环境,比如C#.VB.Net等语言写的程序需要运行在CLR上,然后CLR解析执行操作系统的相关指令,CLR是.net程序运行在操作系统的 ...
- 通过yeelink平台监控树莓派CPU温度变化
通过yeelink平台监控树莓派温度,是很多派友入门第一课.作为一名刚入手树莓派裸机不久的新手,在没有其他硬件支持的情况,通过yeelink平台来监控树莓派CPU温度变化,也是我学习树莓派.学习智能硬 ...
- 【POI word】使用POI实现对Word的读取以及生成
项目结构如下: 那第一部分:先是读取Word文档 package com.it.WordTest; import java.io.FileInputStream; import java.io.Fil ...
- Eclipse配置Lifery SDK步骤与错误解决。
第一步.我们先去官网下载我们要用的东西 1.Eclipse 2.SDK 3.Tomcat 这是官网下载地址-->https://www.liferay.com/zh/downloads 下面是图 ...
- 常用eclipse 快捷键
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...