这几天做到PAT一道比较数据大小的题PAT1065,题目不难,应该说是一道送分题,就是开数组,然后模拟人工计算的过程进行计算,再比较下就行。做完之后,联想到haskell的Integer类型是无限大的,那用到这个题里岂不是甚好!而PAT正好又支持用haskell进行答题,于是我就蛋疼地尝试用haskell来做这个题。

不过之前的haskell的知识快忘得差不多了,赶紧上网脑补。花了不少时间把程序写好了,就下面几句。

 run x count
| x == = return ()
| otherwise = do
[a,b,c] <- (map read.words) `fmap` getLine
let s= a + b
sc=show count
putStr ("Case #"++sc++": ")
if s > c
then putStrLn "true"
else putStrLn "false"
run (x-) (count+) main = do
n <- read `fmap` getLine
run n

代码总共15行左右,用C来写的话应该在25行的样子,的确要稍微简洁了些。不过我还是感觉这段代码带有浓浓的命令式语言(imperative language)的编程风格,应该还可以再简化些。写的过程中碰到N多问题,主要是之前学习的时候,大部分时间都在学习haskell的语法和理念,都没有真正涉及几个像样有IO的程序。

感叹下haskell确实比较难用,对新人一点都不友好,难怪没几个公司敢用,招不到人啊!不像什么java,c,c++,或者php什么的,满大街的程序员,随手拈来都能够应付。但是haskell程序员可不是那么好当的,没两把刷子还真不敢对别人说自己会haskell。haskell里面新的概念如monad,lazy evaluation,purity,type class,type inference等,对其他语言阵营,尤其是非函数式编程范式语言中切换过来的人,无疑是一场颠覆认知的狂风骤雨,很难领会,不说进阶,即使是入门也需要费很大精力。

我在学习这些概念的时候,一开始是觉得很新奇,函数可以被当成变量,任意传递,甚至函数可以partial apply形成新的函数,原来程序还可以这麽写,不过学得稍深一点后,对haskell中的太多限制很不爽,有点质疑其背后的设计理念,没有循环,所有的循环都得通过递归来实现,没有变量的概念,虽然看起来好像是几个变量,但是他们跟C语言中的变量截然不同,可以把他们理解成不变量,因为一旦绑定为某一个值,那么他就是那个值,不会改变也不能够改变。

haskell引以为傲的purity,即没有side effect,在语言设计者的眼里,这就是一朵上上乘的皇冠,有了purity,程序出错的几率大大减小了,并行也不在话下,haskell的粉丝们都说

 
用haskell写的程序,只要编译通过了,就不会有问题了

haskell严格的类型检查,的确让程序员能够在第一时间发现自己程序中的错误,减少犯错的机会。

要吐槽一下,如果你是haskell新手,你一定会发现haskell的编译提示非常不友好,即便是个经验丰富的老手也会常常被ghc莫名其妙的错误提示摇头晃脑头晕目眩。haskell代码的简洁也依赖于程序的结构性,尤其是代码缩进必须要规范,但是编译器又不能够识别缩进的问题,只会在你缩进不正确的时候,按照你当前的缩进进行parse,然后给出一堆你怎么也想不明白的错误提示。

haskell是一门很有趣的语言,很多概念与代数中的一些概念是同根同源的,小时候只能够死记硬背地把某一个名词记住,现在我才对这些光鲜的名词背后的意思有了了解,这是我又一次觉得那麽多年的数学还是不算白学。三月的PAT考试希望能够发挥得好一点,Curry大叔在天之灵可要保佑我,你看我在实验室都是偷偷抽出时间来学习您的语言,多麽不容易。;)

最新文章

  1. JS/JQuery针对不同类型元素的操作(radio、select、checkbox)
  2. Prime Time使用
  3. python 格式化 json输出
  4. js 完成对图片的等比例缩放的方法
  5. win7 安装Oracle 10G,11G
  6. HDU 1695 GCD 莫比乌斯反演
  7. STL中deque
  8. 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
  9. HUST - 1599 Multiple
  10. Hadoop集群搭建的密钥配置SSH实现机制的配置(2)
  11. IntelliJ IDEA 14.1.4设置关闭自动保存和标志改动文件为星号?
  12. linux ssh 报错failed - POSSIBLE BREAK-IN ATTEMPT
  13. Python18 Django 基础
  14. 关于APP,原生和H5开发技术的争论 APP开发技术选型判断依据
  15. zabbix自动发现主机并加入组绑定模板
  16. 02: git分支管理
  17. REST easy with kbmMW #17 – Database 6 – Existing databases
  18. MSSQL 2008 密钥
  19. MATLAB在三维坐标中显示图片 并 使得图片部分透明
  20. java 中的好东西 jackson

热门文章

  1. es之过滤器
  2. css内容过长显示省略号的几种解决方法
  3. (转)mnist.load_data()出现错误
  4. React Native商城项目实战14 - 首页中间下部分
  5. php对bom的处理
  6. SQL Server中数据去重单列数据合并
  7. python-笔记-内置函数
  8. 每天一个Linux命令(37)kill命令
  9. 《Using Python to Access Web Data》 Week3 Networks and Sockets 课堂笔记
  10. spring的基础配置