Haskell中的递归

递归就是定义函数以调用自身的方式,关于递归解决问题的实例有很多,如斐波那契数列,还有汉诺塔问题,递归也正是Haskell中用来解决循环问题的关键。

自定义maxinum函数

maxinum取一组可供排序的list作为参数,并且返回其中的最大值。

我们要弄懂一点,一个list的最大值,就是第一个元素,和后面所有袁旭相比较的结果。

maxinum :: (Ord a) => [a]->a
maxinum [] = error "empty"
maxinum [x]=x
maxinum (x:xs)
| x > maxtail = x
| otherwise = maxtail
where maxtail = maxinum xs

自定义replicate函数

replicate函数接收一个int和一个元素作为参数,返回int个元素的list。

replicate :: (N um i ,Ord i ) =>i->a ->[a]
replicate n x
| n <=0 =[]
| otherwise = x:replicate(n-1) x

Note : Num不是Ord的子集,也就是说 数字不一定拘泥于排序。

自定义take函数

take函数接收一个int和一个list作为参数,对list进行切片。

take :: (Num i ,Ord i) =>i->[a]->[a]
take n _
| n <=0 = []
take _ [] =[]
take n(x:xs)=x:take(n-1) xs

自定义reverse函数

在haskell中支持无限list,是一种无限的数据结构,,无限list的好处就在于我们可以在任意位置令其断开。

reverse :: [a] -> [a]
reverse []=[]
reverse (x:xs) = reverse xs ++ [x]

自定义repeat函数

repeat函数取一个元素作为参数,然后返回无限长的仅存在该元素的list。

repeat :: a ->[a]
repeat x = x:repeat x

快速排序

排过顺序的list就是令所有小于等于头部的list在左边,大于等于头部的list在右边,也就是无序区元素的归位操作。

quicksort :: (Ord a) =>[a] ->[a]
quicksort [] = []
quicksort (x:xs) =
let smallersort = quicksort[a|a<- xs, a <=x] -- 属于xs,并且小于x
let biggersort = quick[a|a<- xs,a>x]
in smallersort ++ x ++ biggersort

用递归来思考

递归的固定模式:先定义一个边界条件,在定义一个函数,让它从一堆元素中处理一件事情后,再把余下的元素重新交给这个函数,直到达到边界条件。

比如 sum 函数就是一个list的头部与其尾部的sum。

所谓的边界条件就是为了避免进程出错而设置的保护措施,也就是在定义递归时需要思考它在什么条件下不可用,终止递归。

高端函数

高端函数就是可以接受函数作为参数也可以返回函数作为结果,Haskell的思想就是定义问题是什么来解决问题。

本质上,Haskell的所有函数都只有一个参数,所有的多参数函数都是curried functions,比如max函数,它会先回传一个含有一个参数的函数,5为参数对它进行调用,然后返回,也就是(max 4) 5,所以说我们定义函数使->代表的就是回传函数,后面接的就是本次或下一次传入的参数。

lambda函数

lambda函数就是匿名函数,有时我们要传递给高端函数一个函数,而这函数我们只用一次,那么编写一个匿名函数是最好的选择。

编写lambda,就写 \ 参数 ->函数体

filter函数

filter函数取一个限制条件和一个list,回传该list中所有符合该条件的元素。

类型声明:

filter :: (a -> Bool) -> [a] ->[a]
fiter _ [] = []
filter p(x:xs)
| p x =x: filter p xs
| otherwise = filter p xs

map函数

map取一个函数和list作为参数,遍历该list的每个元素来调用该函数返回一个新的list。

类型声明:

map :: (a -> b) ->[a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

应用:

ghci> map (+3) [1,5,3,1,6]
[4,8,6,4,9]
ghci> map (++ "!") ["BIFF","BANG","POW"]
["BIFF!","BANG!","POW!"]
ghci> map (replicate 3) [3..6]
[[3,3,3],[4,4,4],[5,5,5],[6,6,6]]
ghci> map (map (^2)) [[1,2],[3,4,5,6],[7,8]]
[[1,4],[9,16,25,36],[49,64]]
ghci> map fst [(1,2),(3,5),(6,3),(2,6),(2,5)]
[1,3,6,2,2]

函数的组合

在数学中  函数组合是这样定义的 (f · g)(x) = f(g(x)),表示组合两个函数,并把gx的返回值作为fx的参数,haskell中定义函数组合的定义很像。

(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)

函数组合的用处之一就是生成新的函数,并传递给其他函数

$函数

$函数的作用就是把函数编程右结合的,函数默认是做结合.

Haskell复习笔记(二)的更多相关文章

  1. Haskell复习笔记(一)

    Haskell笔记这是第三次总结,前两次都因为各种原因丢失了,对于Haskell我算不上什么大神,只不过在大学时为了学习算法时选择了Haskell. 当时的入门书籍选择的是<Learn You ...

  2. Java复习笔记(二):数据类型以及逻辑结构

    一.数据类型 1.数据类型又分为基本数据类型和引用数据类型,而他们的区别在于,引用数据类型需要开辟内存空间来进行分配,什么意思呢?先来看看他们有哪些. 整数型:byte,short,int,long ...

  3. Java二次复习笔记(1)

    Java二次复习笔记(1) Java采用的默认字符编码集是Unicode. byte=byte+byte报错,值为int,而byte+=byte不报错.同样short = short+short报错, ...

  4. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. 数位DP复习笔记

    前言 复习笔记第五篇.(由于某些原因(见下),放到了第六篇后面更新)CSP-S RP++. luogu 的难度评级完全不对,所以换了顺序,换了别的题目.有点乱,见谅.要骂就骂洛谷吧,原因在T2处 由于 ...

  8. 纯JS实现KeyboardNav(学习笔记)二

    纯JS实现KeyboardNav(学习笔记)二 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 这篇主要是添加css,优化js编写逻辑和代码排版 GitHub项目源码 ...

  9. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

随机推荐

  1. 配置maven和maven本地仓库

    l配置maven: 下载maven 网站: http://maven.apache.org/download.cgi 下载解压,在配置maven 右键本地电脑   选择 属性  在选择高级环境变量在选 ...

  2. ubuntu下安装pandas出现 compile failed with error code 1 in /tmp/pip_build_hadoop/pandas

    都是用pip装的,是不是应该用apt-get 装的呀 ubuntu下安装pandas (出现 compile failed with error code 1 in /tmp/pip_build_ha ...

  3. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  4. 菜鸡谈OO 第一单元总结

    “OOP永远是我的好朋友爸爸!” ——来自某无能狂怒的菜鸡 身处在OO的第一个摸鱼黄金周中的我,感觉到了巨大的满足感.如果写博客这种充满意义的事情可以代替我们亲爱的作业,那么我提议每周来两个:)下面开 ...

  5. js根据顺序加载,有依赖关系

    function loadScript(url, callback) { var script = document.createElement("script"); script ...

  6. 关于分布式环境下的id生成

    public class IdWorker { //基准时间 public const long Twepoch = 1288834974657L; //机器标识位数 ; //数据标志位数 ; //序 ...

  7. Data Center手册(2): 安全性

    有个安全性有下面几种概念: Threat:威胁 Vulnerability: 安全隐患 Attack: 攻击 有关Threat 常见的威胁有下面几种 DoS(Denial of Service拒绝服务 ...

  8. [.net 面向对象程序设计深入](18)实战设计模式——设计模式使用场景及原则

    [.net 面向对象程序设计深入](18)实战设计模式——设计模式使用场景及原则 1,什么是设计模式? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...

  9. 企业IT管理员IE11升级指南【9】—— IE10与IE11的功能对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  10. Hystrix概念设计

    1. Hystrix概念设计 1.1. 大纲 1.2. 基本的容错模式 1.3. 断路器模式 1.4. 舱壁隔离模式 1.5. 容错理念 凡事依赖都可能失败 凡事资源都有限制 网络并不可靠 延迟是应用 ...