什么时候你可以学一下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 == old
  then SVar new 
  else SVar sVar
instantiateOne pair (SFunc type1 type2 beta) =
  let
    left1 = instantiateOne pair type1
    left2 = instantiateOne pair type2
  in
    SFunc left1 left2 beta
instantiateOne pair (MyPair type1 type2 beta) =
  let
    left1 = instantiateOne pair type1
    left2 = instantiateOne pair type2
  in
    MyPair left1 left2 beta
instantiateOne pair (MyCons type1 type2 beta) =
  let
    left1 = instantiateOne pair type1
    left2 = instantiateOne pair type2
  in
    MyCons 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值