Fork me on GitHub

为什么同样是函数语言, Haskell 和 Scheme差别那么大呢?

同样是有人研究的语言, 同样是函数式的方向, 我本能上觉得应该一样的呀.
为什么 Haskell 设计了很复杂的(->对新手)类型系统, 这样是什么意图?

Submitted by at 6 years ago

所有回复

不是复杂,是使事情更简单,明确,防止程序出错。引用两句话,The goodness of Haskell is that everything is explicit, so is the badness. Programming in a language with strong type arises less bugs.

IceIsSleepingWater 6 years ago

Scheme 是 Strong Typed 的语言, 这个和 Haskell 一样的呀
http://en.wikipedia.org/wiki/Comparison_of_programming_languages#Type_systems
总不至于因为是动态语言就增加更多 Bug 了

jiyinyiyong 6 years ago

@jiyinyiyong 都是,不假。Haskell也可以不必声明类型签名,因为有类型推断,但是声明了类型签名Haskell通过类型推断来尽力保证你写的是你想实现的功能。动态语言有自由,比如1+String,1+Object什么的,结果很无厘头。再如bash程序想一次性地写一个没bugs的程序我觉得几乎是不太可能

IceIsSleepingWater 6 years ago

@IceIsSleepingWater Bash 这么邪恶的系统管理工具就不能算语言.
再说一个有点经验的 coder 也不会故意动手脚去写 (+ Int String)

jiyinyiyong 6 years ago

Haskell 的类型系统之所以复杂,主要还是针对做科研的人来说的吧,基本的概念还是很容易理解的,新手也不需要掌握那么多。当然现在不少 library 都猛往类型上添加东西,要使用它们就必须去了解一些不常用的理论,也造成了上手的难度。

只要对类型理论有一定程度的了解,使用 Scheme 这样的动态捕捉类型错误的语言也没啥不好。但是有几个观点我觉得可以讨论一下。

  1. 是说动态语言适合快速进行 prototype 开发,我无法认同这点。毕竟存在类型错误的程序就是错误的,即便是 prototype 也不应该容忍。提早纠正类型错误理应更适合快速开发。
  2. 是说动态语言能够写出正确的程序,但是因为静态类型检查的条条框框太多,所以不一定能够通过检查,尽管这个程序理论上是类型正确的。我赞同这个意见。但是这类程序很少能遇到。
  3. 是说静态语言可以在类型上人为加入限制,从而保证只有满足某些条件的代码能够通过检查。也就是说只要能够编译,那么你的程序必然满足某些定理。这个我觉得还是蛮有用的。

剩下的区别我觉得主要是习惯上的吧。是在编译时抓虫还是在运行后抓虫,看你喜欢哪种了。两种方式都能够诞生高质量的代码。我个人喜欢类型系统帮我查错,省去自己不少麻烦。

Int + String 这种错误很低级,但是一旦涉及高阶函数,existential type 什么的,错误经常藏得很深,甚至首先是逻辑理解上的错误才造成类型错误。我有时就算被告知有类型错误,也要花上大半天才能真正明白程序是哪里有错,也算是一种自我加强理解的方式。

所以明确自己所写的函数类型,更有助于逻辑思维,尽管这和类型检查什么时候做无关。大牛们通常写之前就成竹在胸,我等小虾米做不到,只好依赖静态类型系统的辅助了。

ninegua 6 years ago

类型系统, 到 type constructor 就就得学习阻力很大了.
九瓜老师平时写的代码主要是解决什么的?

jiyinyiyong 6 years ago

@jiyinyiyong 什么都有。简单的如 id3 转码,切分 srt 字幕,批量数据处理;稍复杂的如 UI 界面,图表,网站,数据库;研究性质的如编译器解释器,代码优化,类型分析,等。

我比较喜欢 DSL 方面的研究和应用,比如我读博时参与了一个网络协议的项目,我是里面唯一一个搞 PL 的杂牌军。我用 haskell 进行拓扑分析,生成 ILP 程序送给 cplex 执行,能够很灵活地对模型和算法进行调整。有类型系统帮助保持程序的正确性很重要,因为一次运行可能需要好几天,经不起反复调试折腾。小组其他成员表示很满意,xixi。所以类型系统对我来说意义重大。

ninegua 6 years ago

@ninegua 看到 UI 我就膜拜了..
我看教程的时候真是想不到 Haskell 能用到这么多方面啊,
而且还没写过运行好几天的程序, 缺憾了

jiyinyiyong 6 years ago

@ninegua 哇,九瓜老师的涉猎范围好广啊,膜拜,我的CL范围都没这么广

Liutos 6 years ago

我自己写HASKELL代码的时候由强烈的感觉,那就是一般编译通过了,基本程序就改对了

另外我对类型类的理解就是全面的基于接口的编程

julian 6 years ago

同感——编译通过了,程序基本也就是对的了。

jyaki 5 years ago