随笔分类 -  functional programming

haskell中的cps
摘要: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)这是一段递归求阶乘的python代码。用cps改写就是def fact_cps(n,r... 阅读全文
posted @ 2013-09-27 15:56 a++ 阅读(851) 评论(0) 推荐(0)
haskell中的monad
摘要:monad本意是单子。在haskell中,第一个接触的基本都是IO action,通过把IO动作包装起来我们能很方便的与现实世界进行数据交换。但其实monad的用途不止如此,monad还能讲一系列操作进行序列化,而这一点在通常编程中是非常需要的。而在haskell中,类似的事情则是通过递归来完成了平时需要序列化的工作。但其实haskell中也有能进行顺序操作的方法,那就是monad。一个类似于monad的定义基本是这个样子的。class Computation c where success :: a -> c a failure :: String -> c a augme... 阅读全文
posted @ 2013-09-23 22:13 a++ 阅读(1142) 评论(0) 推荐(0)
haskell中的let和where
摘要:haskell中有两种定义局部变量的方法let和where,方法分别如下roots a b c = ((-b + det) / (a2), (-b - det) / (a2)) where det = sqrt(b*b-4*a*c) a2 = 2*aroots a b c = let det = sqrt (b*b - 4*a*c) a2 = 2*a in ((-b + det) / a2, (-b - det) / a2)这两种方法都可以使全局变量定义失效det = "He... 阅读全文
posted @ 2013-09-15 22:53 a++ 阅读(2680) 评论(0) 推荐(0)
haskell io模块
摘要:haskell中的io模块主要是用于读写文件屏幕的,通过import IO来导入其中有如下常用定义data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteModeopenFile :: FilePath -> IOMode -> IO HandlehClose :: Handle -> IO ()hIsEOF :: Handle -> IO BoolhGetChar :: Handle -> IO CharhGetLine :: Handle -> IO StringhGetContents :: 阅读全文
posted @ 2013-09-15 15:33 a++ 阅读(687) 评论(0) 推荐(0)
haskell中的do
摘要:在haskell中,有一个do的语句专门用来做一些不那么“干净”的事情,比如读写都需要用do来开头一开始以为do的作用是做monad,后来发现是错误的,其实do做的事情是包裹一个顺序操作比如在如下代码中main=do if 2>1 then do putStrLn "Step 1" putStrLn "Step 2" else putStrLn "Step 3"第三行中的do如果缺少的话,编译器会报这个错误 The function `putStrLn' is applied to three arguments, bu 阅读全文
posted @ 2013-09-15 12:54 a++ 阅读(803) 评论(0) 推荐(0)
haskell debug
摘要:最近在学习haskell这门神奇的语言,但是由于print不方便,程序出错的时候都不知道是怎么回事。网上搜了一把发现有这么一个好东西import Debug.Tracefunct :: Integer -> [Integer] -> Bool funct a list = trace (show list) $ funct (a + 1) (a : list)这样子一来会把递归过程中的每一步都打印出来,方便多了,但是要注意的是,由于lazy evaluation的关系,debug输出会和程序的正常输出混在一起 阅读全文
posted @ 2013-08-11 10:21 a++ 阅读(466) 评论(0) 推荐(0)