haskell 乱搞笔记[原创]
|
脑洞时间:为什么世界上有那么多程序语言,那是腐朽的资本主义为了增加广大人民学习成本以及编译原理太过普及造成的,建议大学取消编译原理的一切课程,并挥起奥姆休的剃刀,把所有程序语言统统踢了,除机器语言外只留下两种语言:汇编和haskell(逃
简明扼要的写一点haskell 好玩的东西
首先是一些基本操作,命令行按ghci进入,一些基本操作前面用冒号,用惯vim的人应该很熟悉,比如
:quit 退出
:t 显示变量的类型(char,int之类的)
:l 链接外面写好的函数文件,事实上这种模式不能自己写函数,必须在外面写好后再link进来才能用
首先很精彩的便是list,list和python里的list或是其它语言中的array有点像,用一对方括号括起来,比如[1,5,2,2] ["xin","ru","zhang"]
然后就是和python不一样的了,haskell能够猜,比如[1..5]表示[1,2,3,4,5] [1,3..9]表示[1,3,5,7,9]前面两个元素以及最后的元素,haskell便能自动判断并填充步长,此外惰性求值也是haskell有别于python的地方 比如我可以不写最后一个元素[1..]表示的就是[1,2,3,4,5,........]所有自然数,它的元素个数是无限的,但是haskell不会傻到把无限的数放到内存里,而是放着不管它,等到要用的时候再计算
然后就是list的一个大杀器了,你让一个高中生写一个正奇数的集合,那么可能是这样写:{2*k-1| k>=1} 如果用C语言之类的写呢,一般会这么写:for(int i = 1;i <= MAXN ; i++)oddArray[i] = 2 * i - 1; 然后如果用haskell写可以是这样的 [2 * k - 1 | k <- [1..]] woc!!!还可以加限制条件比如要找除7余数为1的奇数可以这么写: [2 * k - 1 | k <- [1..] , (2 * k - 1) `mod` 7 == 1] 相比之下其它写法真是low爆了!
第二件萌萌哒事就是,haskell并没有循环!haskell并没有循环!haskell并没有循环!重要的事要说三遍.事实上函数式编程是基于和图灵机等价的lambda演算的,所以请不要把它看作这个PC的生物!所以呢只能靠萌萌哒递归来处理了,举个栗子,要求一个list中最大的元素, let a = [1,5,6,2],当然有系统提供的函数maximum,直接maximun a就可以,但是如何自己造这个轮子呢,可以写成这样:
max' [x] = x
max' (x:xs)
|x > max' xs = x
|otherwise = max' xs
嘛,反正haskell会从上到下匹配,所以如果把递归上面那么就有神奇的左递归出现...
max'是函数名haskell 允许在函数名后加个'来区分哪些功能只差一点的函数,而不是max1,max2,max3...maxinf
这个很好理解当list中只有一个元素时最大值就是本身,否则就等于第一个元素和数组中剩下元素最大值的最大值,翻译成C应该是这个样子:
int max(std::vector<int> Arr, int k)//求数组Arr[]第k个元素开始到最后一个元素的最大值
{
if(k+1 == Arr.size())return Arr[k];
int leftMax = max(Arr , k+1);
if(leftMax > Arr[k])return leftMax;
else return Arr[k];
}
同理求list里所有element的和可以这么写
sum' [x] = x
sum' (x:xs) = x + sum' xs
如果说以上那么多废话都是helloworld水平半小时内看下书就可以学会的东西的话,那看到下面这个东西才是真正让我觉得有记录必要的东西,快排!
sort' []=[]
sort' [x] = [x]
sort' (x:xs)=sort'[y|y<-xs,y<=x]++[x] ++ sort'[y|y<-xs,y>x]
这个姿势的快排美爆了啊,那些C++2min 1min敲完的手速狗门快哭了啊!!有木有!!接触haskell俩小时,印象就是递归写的东西这货写都很美!!
|
haskell 乱搞笔记[原创]的更多相关文章
- haskell 乱搞(2)之 Y-conbinator [原创]
Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中 这是数学笔记,这是数学笔记,这 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞
没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...
- bitset 的妙用:乱搞字符串匹配
最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
随机推荐
- uvm_marcos——UVM宏定义
I programmed all night.Through the window, on my screen,The rising sun shined. 编程一整夜,透过窗户,照在屏幕上.初升的太 ...
- HDU 1520 Anniversary party (树形DP,入门)
题意:给一棵树,每个节点都有权值,要求选择部分节点出来,使得权值之和最大,但是每对(父亲,儿子)中最多只能挑一个. 思路: 比较入门的题,每个节点可以选也可以不选.若当前节点选的话,孩子必须全部不选: ...
- jni 修bug
1. ReferenceTable overflow (max=512) 内存泄露,程序运行一段时间就挂掉了. 在利用反射调用java中的函数需要释放掉查找到的类 void publishJava ...
- 基本编程题 --python
1.让Python帮你随机选一个饮品吧! import random listC = ['加多宝', '雪碧', '可乐', '勇闯天涯', '椰子汁'] print(random.choices(l ...
- 2018 北京区域赛 I - Palindromes (找规律)
题目 HihoCoder - 1878 题目大意 给出k,让求出第k个回文数(k的“长度”不超过1e5) 题解 之前做过类似的题,是统计各阶段的数找到第K个回文数,但这里K太大,需要寻找新的方法. 打 ...
- win10 多桌面 win+tab | ctrl+win+左右箭头
win10 多桌面 win+tab | ctrl+win+左右箭头
- JS计算两个日期时间差,天 小时 分 秒格式
function diffTime(startDate,endDate) { startDate= new Date(startDate); endDate = new Date(endDate); ...
- Java中集合类
一.Collection Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也可以看出,它是List 和 Set ...
- UVa-12096-集合栈计算机
这题的话,我们读入操作之后,首先对于空集就是初始化为空. 我们可以使用typedef 对于 set 重命名为Set,这样就可以直接用Set()的语法进行空集的初始化了. 这题主要是对于集合的处理,我们 ...
- 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski
还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...