目录

背景

优点一 定义数据类型

优点二 定义解析

优点综述

缺点

总结

作业


背景

以前搞不懂为什么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也有很多缺点,正如其他好多函数式编程语言一样。比如:

  1. 第三方库好多都是个人业余项目,缺少维护;
  2. 第三方库好多文档缺失,只能通过查看库的代码来逆推出怎么调用;
  3. 很抽象的函数式代码非常晦涩,难以阅读;
  4. 学习成本高,可能你学了但是用不上,这是需要灵感和经验结合的。

总结

编程语言的设计是对思维的抽象,技多不压身。多了解一种思维,一种范式,会对现有项目做更客观的分析。为了找工作,还是先精通类似C++,Java和Python等等常用语言吧。

作业

看一下Python的Haskell解析库: GitHub - bjpop/language-python: A parser for Python 2.x and 3.x written in Haskell

什么时候你可以学一下Haskell相关推荐

  1. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  2. 如何设计一门语言(八)——异步编程和CPS变换

    关于这个话题,其实在(六)里面已经讨论了一半了.学过Haskell的都知道,这个世界上很多东西都可以用monad和comonad来把一些复杂的代码给抽象成简单的.一看就懂的形式.他们的区别,就像用js ...

  3. 纯函数式编程语言_纯功能编程语言如何改变您的生活。

    纯函数式编程语言 by Andrea Zanin 由Andrea Zanin 纯功能编程语言如何改变您的生活. (How a purely functional programming languag ...

  4. [技术] 谈谈编程思想

    https://zhuanlan.zhihu.com/p/19736530?columnSlug=prattle 作者:陈天 链接:https://zhuanlan.zhihu.com/p/19736 ...

  5. 如何零基础转行成为一个自信的前端达人

    一,背景介绍 我本科学的是国际贸易,乱选的专业.毕业后做了半年外贸,实在不喜欢,然后去做英文编辑了.第二份工作也很无聊,就是写英文软文,发表在国外的行业期刊上,给公司做广告.然后也做英文官网的内容.这 ...

  6. [转载]GIS派系大解密(转)_拔剑-浆糊的传说_新浪博客

    有意思! 原文地址:GIS派系大解密(转)作者:半吊子 转自:http://www.esristone.com/show.aspx?id=45&cid=53 其实咱所GIS(注:北大遥感所)和 ...

  7. Twitter只剩下两个硬核程序员了!

    经过一轮又一轮的裁员,Twitter大批骨干离职. 有人戏称:现在Twitter办公室里只剩下两个(应该说是最硬核)的程序员了. 这两个人中一个自然是老板Elon Musk. 另外一个则是33岁的Ge ...

  8. 《Haskell趣学指南》—— 第1章,第1.2节小朋友的第一个函数

    本节书摘来自异步社区<Haskell趣学指南>一书中的第1章,第1.2节小朋友的第一个函数,作者 [斯洛文尼亚]Miran Lipovaca,更多章节内容可以访问云栖社区"异步社 ...

  9. 《Haskell趣学指南》笔记之I/O

    系列文章 <Haskell趣学指南>笔记之基本语法 <Haskell趣学指南>笔记之类型(type) <Haskell趣学指南>笔记之函数 <Haskell趣 ...

最新文章

  1. R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关或者部分相关性系数并用建设检验检验相关性的显著性
  2. OpenCV在ARM上的移植
  3. Kappa信息化谋局电子商务与传统渠道的全面管理
  4. mysql 分组查出来横向展示_MySQL汇总分析(group by)
  5. Struts2学习笔记(七) 结果(Result)(下)
  6. MediaElement 播放本地视频文件
  7. Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
  8. html鼠标各种坐标,各种MOUSE鼠标形状的表示方法
  9. 计算机组成原理的IR,计算机组成原理
  10. android brvah 分组,RecyclerView使用BRVAH完成分组布局效果
  11. c#练习——简单的文字编辑器
  12. 面试宝典之深度学习面试题(下)
  13. 前端微信支付代码(公众号支付)
  14. 清华EMBA课程系列思考之十五 -- 企业绩效管理 -- 战略性绩效管理
  15. 逍遥刘强 - 期货大作手风云录(2015年8月28日)
  16. python中等好用什么表示_描写中等的词语
  17. 词嵌入向量WordEmbedding的原理和生成方法
  18. Python爬虫实例,一小时上手爬取淘宝评论(附代码)!
  19. 无线路由器的dhcp服务器是什么,路由器dhcp是什么 路由器dhcp服务器如何设置
  20. 锂离子电池和燃料电池特性介绍

热门文章

  1. 太原铁警严厉打击倒卖车票 查获假票60张
  2. 解决touchStart滑动时触发点击事件
  3. XLua Coroutine协程
  4. 知识图谱可视化——Neo4j (windows)
  5. 慧博云通深交所上市:半年营收5.6亿募资3亿 市值108亿
  6. PHP微信小程序之获取并解密用户数据获取openId和unionId
  7. 计算机计磁盘术语,计算机术语-磁盘
  8. 手推梯度提升树GBDT
  9. Android Studio App开发之使用摄像机录制视频和从视频库中选取视频的讲解及实战(附源码)
  10. 天下乌鸦一般黑...