脑洞时间:为什么世界上有那么多程序语言,那是腐朽的资本主义为了增加广大人民学习成本以及编译原理太过普及造成的,建议大学取消编译原理的一切课程,并挥起奥姆休的剃刀,把所有程序语言统统踢了,除机器语言外只留下两种语言:汇编和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 乱搞笔记[原创]的更多相关文章

  1. haskell 乱搞(2)之 Y-conbinator [原创]

    Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中 这是数学笔记,这是数学笔记,这 ...

  2. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

  3. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  4. bitset 的妙用:乱搞字符串匹配

    最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...

  5. URAL 1827 Indigenous Wars(排序、乱搞)

    题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...

  6. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  7. Codeforces 732e [贪心][stl乱搞]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...

  8. 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

    4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Statu ...

  9. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][ ...

随机推荐

  1. 【排序】插入排序:最稳定:时间复杂度O(n^2)

    想象着自己在玩扑克的时候抓牌,每抓到一张牌,按照从小到大的顺序排序. 如果第二张的点数小于第一张,就交换这两张牌,默认每次抓牌之前,前面的已经排好序了. 再来一张牌,与第二张比较,如果小于第二张,交换 ...

  2. IDEA 启用/禁用 Run Dashboard

    一.启用 方式一: 创建/打开一个SpringBoot项目[或者点击Run --> Edit Configurations 添加 Spring Boot 类型的项目配置:或者如图在红框处添加配置 ...

  3. SQL,数据库连接

  4. Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)

    优先队列模拟一下就好. #include<bits/stdc++.h> using namespace std; priority_queue<int>q; int main( ...

  5. div+css实现几种经典布局的详解

    一.左右两侧,左侧固定宽度200px,右侧自适应占满 <div class="divBox"> <div class="left">&l ...

  6. 数组初始化 和 vector初始化

    ] = {}; 整个数组都初始化为0 vector<); 整个vector初始化为1 如果你定义的vector是这样定义的: vector<int> B; 去初始化,千万不要用: ; ...

  7. C01 C语言基础

    目录 C语言简史及特点 C语言开发环境 C语言程序结构 C语言基本输入输出函数 编译 软件类型 C语言简要及特点 什么是计算机语言 计算机语言是用于人与计算机之间通讯的语言. 计算机遵照接收到的计算机 ...

  8. Xcode 6 创建 Empty Application

    1.创建一个 Single View Application: 2.删除工程目录下的 Main.storyboard 和 LaunchScreen.xib: 3.打开 Supporting Files ...

  9. vue 使用element-ui实现城市三级联动

    <template> <div> <el-select v-model="prov" style="width:167px;margin-r ...

  10. js最高效的数组去重方法

    var arr=[1,2,33,2,4,5,33,5,7,8,1,3];var result=[];var temp={};for( var i=0;i<arr.length;i++){ if( ...