haskell中的do】的更多相关文章

monad本意是单子.在haskell中,第一个接触的基本都是IO action,通过把IO动作包装起来我们能很方便的与现实世界进行数据交换.但其实monad的用途不止如此,monad还能讲一系列操作进行序列化,而这一点在通常编程中是非常需要的.而在haskell中,类似的事情则是通过递归来完成了平时需要序列化的工作.但其实haskell中也有能进行顺序操作的方法,那就是monad.一个类似于monad的定义基本是这个样子的. class Computation c where success…
在haskell中,有一个do的语句专门用来做一些不那么“干净”的事情,比如读写都需要用do来开头 一开始以为do的作用是做monad,后来发现是错误的,其实do做的事情是包裹一个顺序操作 比如在如下代码中 main=do > then do putStrLn "Step 1" putStrLn "Step 2" else putStrLn "Step 3" 第三行中的do如果缺少的话,编译器会报这个错误 The function `put…
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) 这是一段递归求阶乘…
haskell中有两种定义局部变量的方法let和where,方法分别如下 roots a b c = ((-b + det) / (a2), (-b - det) / (a2)) *a*c) a2 = *a roots a b c = let det = sqrt (b*b - *a*c) a2 = *a in ((-b + det) / a2, (-b - det) / a2) 这两种方法都可以使全局变量定义失效 det = "Hello World" roots a b c =((…
1. 运行命令cabal install glib时出现错误: Cannot find gtk2hsC2hs Please install `gtk2hs-buildtools` first and check that the install directory is in your PATH (e.g. HOME/.cabal/bin). 2. 运行命令cabal install gtk2hs-buildtools Installed gtk2hs-buildtools-0.12.5.2 3…
①循环?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…
haskell中的io模块主要是用于读写文件屏幕的,通过import IO来导入 其中有如下常用定义 data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode openFile :: FilePath -> IOMode -> IO Handle hClose :: Handle -> IO () hIsEOF :: Handle -> IO Bool hGetChar :: Handle -> IO Ch…
说到 Haskell,这真是一门逼格极高的编程语言,一般初学者如果没有相关函数式编程的经验,入门直接接触那些稀奇古怪的概念,简直要跪下.现在回想起来,隐隐觉得初学者所拥有的命令式编程语言(imperative programming language)相关的知识和经验反而成了负担,若能抛掉以往固有的观念转以全新的视角来看待这些新奇东西,仿佛会更好接受些,真是莫名其妙. Bartosz Milewski 在其博客上写了不少 Haskell 及函数式编程相关的文章,读来真是受益良多,这位大哥很多年前…
这篇文章是一篇学习笔记,记录我在JS学习中的一个知识点及我对它的理解,知识点和技巧本身并不是我原创的.(引用或参考到的文章来源在文末) 先不解释Partial Application(偏函数应用)和Currying(加里化)的字面意思,从实际的示例入手会比较方便 比如有个function sum(a,b){return a+b} 如果我们想固定一个值,就要先设定这个值: var a=1; sum(a,1);  sum(a,100);…. 或者定义一个新函数 function newSum(x){…
2012-12-29 02:26 by 老赵, 1745 visits 众所周知,.NET中Dictionary的键不能为null,否则会抛出NullReferenceException,这在某些时候会显的很麻烦.与此相对的是Java中的HashMap支持以null为键,则方便许多.尽管null的确不是个好东西,但它既然已经存在,既然给我们造成了麻烦,我们就要想办法去解决它.实现一个自己的字典类自然可行,但要精心实现一个高效的字典并不是件容易的事情,例如BCL中的Dictionary.cs就有超…