Haskell递归】的更多相关文章

maximum 函数取一组可排序的 List(属于 Ord Typeclass) 做参数,并回传其中的最大值.想想,在命令式风格中这一函数该怎么实现.很可能你会设一个变量来存储当前的最大值,然后用循环遍历该 List,若存在比这个值更大的元素,则修改变量为这一元素的值.到最后,变量的值就是运算结果.唔!描述如此简单的算法还颇费了点口舌呢! 现在看看递归的思路是如何:我们先定下一个边界条件,即处理单个元素的 List 时,回传该元素.如果该 List 的头部大于尾部的最大值,我们就可以假定较长的…
<Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学时教程,该书如果不用于赢利,可以任意发布,但需要保留他们的copyright)这本书是学习 Haskell的一套练习册,共有2本,一本是问题,一本是答案,分为24个章节.在这个站点有PDF文件.几年前刚开始学习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.elem rev::[a]->[a] rev []=[] re…
cps全称叫continuation passing style,简要来讲就是告诉函数下一步做什么的递归方式,由于普通递归有栈溢出的问题,而cps都是尾递归(tail recursion),尾递归则是没有栈溢出问题的,所以haskell推荐都用cps的方式去编写代码. 当然,相对于普通递归方式,cps也有着非常不便于理解的问题. def fact(n): if (n==0): return 1 else: return n* fact(n-1) print fact(400) 这是一段递归求阶乘…
monad本意是单子.在haskell中,第一个接触的基本都是IO action,通过把IO动作包装起来我们能很方便的与现实世界进行数据交换.但其实monad的用途不止如此,monad还能讲一系列操作进行序列化,而这一点在通常编程中是非常需要的.而在haskell中,类似的事情则是通过递归来完成了平时需要序列化的工作.但其实haskell中也有能进行顺序操作的方法,那就是monad.一个类似于monad的定义基本是这个样子的. class Computation c where success…
最近在学习haskell这门神奇的语言,但是由于print不方便,程序出错的时候都不知道是怎么回事.网上搜了一把发现有这么一个好东西 import Debug.Trace funct :: Integer -> [Integer] -> Bool funct a list = trace (show list) $ funct (a + 1) (a : list) 这样子一来会把递归过程中的每一步都打印出来,方便多了,但是要注意的是,由于lazy evaluation的关系,debug输出会和…
这里是用 JavaScript 做的逆转序列(数组/字符串)的递归/尾递归实现.另外还尝鲜用了一下 ES6 的destructuring assignment + spread operator 做了一个更 functional 的版本(只支持数组). 正确性能通过测试(参见 放在我 Github 上的 demo,顺手写了一个小小的测试框架),不过效率就要打问号了——特别是用了 ES6 特性的版本.这里主要是写来玩 JS 的函数式特性的. 1. 逆转序列的递归实现 先用 Haskell 实现做草…
doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y doubleSmallNumber x = then x else x * doubleSmallNumber' x = (if x>100 then x else x * 2) + 1 boomBangs xs = [ then "BOOM!" else "BANG!" | x <- xs, odd x] length' xs = sum…
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的Win32库去. 逻辑结构和递归说白了就是做了一个If,一个For_N,If就和Excel里的If一样,For_N是把一个模板结构迭代N遍,为了所谓的方便,把If做成了宏,写起来还挺有意思的 template<typename TTest, typename TTrue, typename TFal…
显示类型声明,Haskell是不用定义类型的原因,很像python 想要确定某个表达式的类型 *Main> :t 'a' 'a' :: Char *Main> :t True True :: Bool *Main> :t "HELLo" "HELLo" :: [Char] 可以用:t 显示 所以当我们定义一个函数时,可以加上类型声明. body.hs函数 addthree::Int -> Int ->Int -> Int addt…
我们已经说明了 Haskell 是一个纯粹函数式语言.虽说在命令式语言中我们习惯给电脑执行一连串指令,在函数式语言中我们是用定义东西的方式进行.在 Haskell 中,一个函数不能改变状态,像是改变一个变量的内容.(当一个函数会改变状态,我们说这函数是有副作用的.)在 Haskell 中函数唯一可以做的事是根据我们给定的参数来算出结果.如果我们用同样的参数调用两次同一个函数,它会回传相同的结果.尽管这从命令式语言的角度来看是蛮大的限制,我们已经看过它可以达成多么酷的效果.在一个命令式语言中,编程…
Haskell functions can take functions as parameters and return functions as return values. A function that does either of those is called a higher order function. Higher order functions aren't just a part of the Haskell experience, they pretty much ar…
本章讲的就是 Haskell 那套独特的语法结构,先从模式匹配开始.模式匹配通过检查数据的特定结构来检查其是否匹配,并按模式从中取得数据. 在定义函数时,你可以为不同的模式分别定义函数本身,这就让代码更加简洁易读.你可以匹配一切数据类型 --- 数字,字符,List,元组,等等.我们弄个简单函数,让它检查我们传给它的数字是不是 7. lucky :: (Integral a) => a -> String   lucky 7 = "LUCKY NUMBER SEVEN!" …
Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >>> a = {1,2,3,4} >>> b ={3,4,5,6} &g…
斯坦福公开课<编程范式>中介绍了Scheme(但是不仅仅是Scheme,它只是作为函数式语言的代表),最后一课介绍了Haskell... “Hello World!”是学习一门语言的魔咒 :) ghc windows上面的winghci   这是一个解释器环境,和python的差不多   在提示符后Prelude>后面输入   "Hello World"   解释器返回 "Hello World",哦耶...   当然,你可以输入一些你能想到的功能…
是任意形式的递归,是化解的一般式. 主题所谓的“递归调用化解为栈处理”,意思是,将递归函数调用化解为“一个由stack_push stack_pop stack_top等函数调用组成的循环式子”.这里的 stack_push, stack_pop, stack_top是指,程序员自己实现的一个ADT(Abstract Data Type)中的函数操作接口,这个ADT叫做栈.要知道,在C语言中,函数调用链本身就是栈处理的,处理C语言中函数调用链的是进程栈/线程栈,进程栈/线程栈是一个C语言程序运行…
七月记录:整个七月就在玩,参加夏令营,去遨游.... 八月份需要开始复习,正等书的这个过程突然想起一直没有完成的学习-haskell,所以当前的目标是用haskell制作一个局域网通信的小工具,要求:一,完成工具要求  二,完备的设计文档   三,报告 学习资料:http://fleurer-lee.com/lyah/chapters.htm  haskell趣学指南 (后续还会有别的书,rwh等) 基本语法: 类型: 常见基本类型:   Int:一般是32bit整数 Integer:无限大整数…
Haskell是纯函数式编程,它强调不函数不改变外部世界状态,即,一个函数的输出只由函数接收的输入决定.那如何与外面沟通呢,比如读取一个文件内容并输出这个文件内容(字符串),显然这种函数非纯函数,因为它的输出是会随着文件内容改变而改变.Haskell在纯函数与外部世界之间建立了一扇门,即Monad,这部分内容以后再介绍. (本文例子多来自real world haskell,原因是这本书给的例子太经典) 1. 与外部世界交流 首先给出一个例子如下,这个函数用于读取输入文件,并作一些处理,然后输出…
一.源文件 介绍这个主要是因为下文很多代码写在源文件中,然后从ghci加载源文件进行测试. 创建一个文本文件,在其中输入,并保存为add.hs文件 -- file: add.hs add x y = x - y 打开ghci,加载刚才的文件(假设文件目录为e:\haskell\add.hs),命令如下 ghci> :cd e:\haskell ghci> :load add.hs ghci> add 二.语言特性 1. 延迟计算 表达式的值在需要用到的时候才被计算,比如在一个文本文档中输…
{- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahaskell.com) > ghc xxx.hs # 编译文件 > ghci # 进入Haskell解释器 ghci> :l test.hs --载入test.hs文件 ghci> :r --重新载入文件 -} -- ch01 Introduction doubleMe x = x + x…
博主是haskell新手.学习haskll的时候遇到了一些问题,在寻求答案的过程中产生了一些思考,可能理解存在偏差,希望各位不吝赐教. 提出问题 <Learn you a haskell for great good>里第六章关于函数foldl(左fold)的部分提到,++操作符比:要昂贵很多,所以我们一般用foldr来构造一个list 第一次看这段话的时候我并没有深究(实际上我认为这句话根本就有毛病,因为foldr也得用++,原文作者根本没把核心问题指出来),因为haskell用都没用过几次…
原文地址:Haskell学习-高阶函数 高阶函数(higher-order function)就是指可以操作函数的函数,即函数可以作为参数,也可以作为返回结果.有了这两个特性,haskell可以实现许多神奇的效果. 柯里化(Currying) 在haskell中所有的算术运算符都是函数(包括大小于等于关系符等),而它们的快捷方式都可以省略操作数(参数). (+) 1 2 -- (+) 是需要两个操作数的函数 > 3 (+1) 2 -- (+1) 是需要左操作数的函数 > 3 (3*) 3 --…
原文地址:Haskell学习-函数式编程初探   为什么要学习函数式编程?为什么要学习Haskell?   .net到前端,C#和JavaScript对我来说如果谈不上精通,最起码也算是到了非常熟悉的程度.这两门语言就像是我的盾牌和宝剑,给我保驾护航,开山劈石,伴随着我不断成长.同时C#和JavaScript它们本身也在不断地进化,不断出现越来越多方便的语法糖,但追根到底很多都是从函数式语言汲取的精华.比如高阶函数,lambada表达式,柯里化等.   于是从探险的角度,以好奇的心态开始学习函数…
Haskell中的递归 递归就是定义函数以调用自身的方式,关于递归解决问题的实例有很多,如斐波那契数列,还有汉诺塔问题,递归也正是Haskell中用来解决循环问题的关键. 自定义maxinum函数 maxinum取一组可供排序的list作为参数,并且返回其中的最大值. 我们要弄懂一点,一个list的最大值,就是第一个元素,和后面所有袁旭相比较的结果. maxinum :: (Ord a) => [a]->a maxinum [] = error "empty" maxinu…
译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 递归简介 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量. 我们来举个例子,我们可以…
<Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学时教程,该书如果不用于赢利,可以任意发布,但需要保留他们的copyright)这本书是学习 Haskell的一套练习册,共有2本,一本是问题,一本是答案,分为24个章节.在这个站点有PDF文件.几年前刚开始学习Haskell的时候,感觉前几章还可以看下去,后面的内容越来越难以理解.现在对函数式编程有了一些了解…
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 + 2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元组,比如身份证列表 3. 字典 key-value对 特性: 无顺序 去重 查询速度快,比列表快多了 比list占用内存多 为什么会查询速度会快呢…
lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以及递归的形式系统. lambda项 lambda演算由 lambda 项的语言构成.基本的 lambda 项只包含以下三种: 语法 名称 描述 Haskell语言中的相应表述 a 变量 表示参数或数学/逻辑值的字符或字符串 a (λx.M) 抽象化 函数定义(M是一个lambda项).变量x在表达式…
fix 函数 fix 是一个在 Data.Function 模块中定义的函数,它是对于递归的封装,可以用于定义不动点函数. fix :: (a -> a) -> a fix f = let x = f x in x fix 函数的定义使用了递归绑定,比较难以理解: fix f = let x = f x in x = let x = f x in f x = let x = f x in f (f x) = let x = f x in f (f (f x)) = let x = f x in…
安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Free f a)) instance Functor f => Functor (Free f) where fmap f = go where go (Pure a) = Pure (f a) go (Free fa) = Free (go <$> fa) instance Functor f…