什么时候你可以学一下Haskell
目录
背景
优点一 定义数据类型
优点二 定义解析
优点综述
缺点
总结
作业
背景
以前搞不懂为什么Facebook要用Ocaml实现好多开源库,今天似乎懂了。
最近在做Python的指针分析,初步定的方案两种,第一是用Python实现,自己分析自己;第二是用Haskell实现。第一种方案的有点是可以无缝使用此语言的库,比如Python的AST解析库都是内置的,方便调用;还有就是可以在这个过程中加深对语言的理解。
但是第二种方案有什么优点呢?
优点一 定义数据类型
我的意见是我们可以充分利用其类型系统。什么是类型系统,就是讨论编程语言中计算的类型和在此基础上的操作。每当你遇到类型错误时,这时候就是类型系统在发挥作用。Haskell的类型系统天然很简洁,给个例子:
data Tree a = Leaf | Tree a (Tree a) (Tree a)
以上代码定义了一个二叉树,叶子结点为Leaf.。如果在其他语言类似Python中,我们可能需要定义一个类抽象出二叉树的定义。在程序中,我一直相信简单的才是最好的。正是因为简单,才能更好地维护。
优点二 定义解析
instantiateOne :: (SVar, SVar) -> SType -> SType
instantiateOne _ SBool = SBool
instantiateOne _ SInt = SInt
instantiateOne _ (MyNil beta) = MyNil beta
instantiateOne (old, new) (SVar sVar) =if sVar == oldthen SVar new else SVar sVar
instantiateOne pair (SFunc type1 type2 beta) =letleft1 = instantiateOne pair type1left2 = instantiateOne pair type2inSFunc left1 left2 beta
instantiateOne pair (MyPair type1 type2 beta) =letleft1 = instantiateOne pair type1left2 = instantiateOne pair type2inMyPair left1 left2 beta
instantiateOne pair (MyCons type1 type2 beta) =letleft1 = instantiateOne pair type1left2 = instantiateOne pair type2inMyCons left1 left2 beta
以上代码是我以前一个编程作业的代码片段,定义了根据SType进行一系列的递归操作。根据我的经验,在Python中实现只会更长。
优点综述
Haskell会强迫你思考你需要的东西,并对其进行简单的表示,最后可以定义基于此表示上的分析。可能实现过程有点难度,但是结束之后,你会发现代码很短很容易维护。函数式语言很适合写项目中的一个组件,类似JSON解析库,Python解析库等等。
缺点
Haskell也有很多缺点,正如其他好多函数式编程语言一样。比如:
- 第三方库好多都是个人业余项目,缺少维护;
- 第三方库好多文档缺失,只能通过查看库的代码来逆推出怎么调用;
- 很抽象的函数式代码非常晦涩,难以阅读;
- 学习成本高,可能你学了但是用不上,这是需要灵感和经验结合的。
总结
编程语言的设计是对思维的抽象,技多不压身。多了解一种思维,一种范式,会对现有项目做更客观的分析。为了找工作,还是先精通类似C++,Java和Python等等常用语言吧。
作业
看一下Python的Haskell解析库: GitHub - bjpop/language-python: A parser for Python 2.x and 3.x written in Haskell
什么时候你可以学一下Haskell相关推荐
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- 如何设计一门语言(八)——异步编程和CPS变换
关于这个话题,其实在(六)里面已经讨论了一半了.学过Haskell的都知道,这个世界上很多东西都可以用monad和comonad来把一些复杂的代码给抽象成简单的.一看就懂的形式.他们的区别,就像用js ...
- 纯函数式编程语言_纯功能编程语言如何改变您的生活。
纯函数式编程语言 by Andrea Zanin 由Andrea Zanin 纯功能编程语言如何改变您的生活. (How a purely functional programming languag ...
- [技术] 谈谈编程思想
https://zhuanlan.zhihu.com/p/19736530?columnSlug=prattle 作者:陈天 链接:https://zhuanlan.zhihu.com/p/19736 ...
- 如何零基础转行成为一个自信的前端达人
一,背景介绍 我本科学的是国际贸易,乱选的专业.毕业后做了半年外贸,实在不喜欢,然后去做英文编辑了.第二份工作也很无聊,就是写英文软文,发表在国外的行业期刊上,给公司做广告.然后也做英文官网的内容.这 ...
- [转载]GIS派系大解密(转)_拔剑-浆糊的传说_新浪博客
有意思! 原文地址:GIS派系大解密(转)作者:半吊子 转自:http://www.esristone.com/show.aspx?id=45&cid=53 其实咱所GIS(注:北大遥感所)和 ...
- Twitter只剩下两个硬核程序员了!
经过一轮又一轮的裁员,Twitter大批骨干离职. 有人戏称:现在Twitter办公室里只剩下两个(应该说是最硬核)的程序员了. 这两个人中一个自然是老板Elon Musk. 另外一个则是33岁的Ge ...
- 《Haskell趣学指南》—— 第1章,第1.2节小朋友的第一个函数
本节书摘来自异步社区<Haskell趣学指南>一书中的第1章,第1.2节小朋友的第一个函数,作者 [斯洛文尼亚]Miran Lipovaca,更多章节内容可以访问云栖社区"异步社 ...
- 《Haskell趣学指南》笔记之I/O
系列文章 <Haskell趣学指南>笔记之基本语法 <Haskell趣学指南>笔记之类型(type) <Haskell趣学指南>笔记之函数 <Haskell趣 ...
最新文章
- R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关或者部分相关性系数并用建设检验检验相关性的显著性
- OpenCV在ARM上的移植
- Kappa信息化谋局电子商务与传统渠道的全面管理
- mysql 分组查出来横向展示_MySQL汇总分析(group by)
- Struts2学习笔记(七) 结果(Result)(下)
- MediaElement 播放本地视频文件
- Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
- html鼠标各种坐标,各种MOUSE鼠标形状的表示方法
- 计算机组成原理的IR,计算机组成原理
- android brvah 分组,RecyclerView使用BRVAH完成分组布局效果
- c#练习——简单的文字编辑器
- 面试宝典之深度学习面试题(下)
- 前端微信支付代码(公众号支付)
- 清华EMBA课程系列思考之十五 -- 企业绩效管理 -- 战略性绩效管理
- 逍遥刘强 - 期货大作手风云录(2015年8月28日)
- python中等好用什么表示_描写中等的词语
- 词嵌入向量WordEmbedding的原理和生成方法
- Python爬虫实例,一小时上手爬取淘宝评论(附代码)!
- 无线路由器的dhcp服务器是什么,路由器dhcp是什么 路由器dhcp服务器如何设置
- 锂离子电池和燃料电池特性介绍