推荐其它几个 Haskell 读物?有很多出色的教学,但我得告诉你Real World Haskell出类拔萃。它太棒了。我觉得它可以和这个教程搭配着一起读。这个教程提供几个简单例子好让初学者对那点概念有个简单认识,而 Real World Haskell 真正教给你如何充分地使用它们。我怎么联络到你?最好的方式是用寄封 email 给我,email 是 bonus at learnyouahaskell dot com。
尽管 Haskell 的纯粹性质带来很多好处,但他让一些在非纯粹语言很容易处理的一些事情变得要用另一种方法解决。由于 referential transparency,同样一件事在 Haskell 中是没有分别的。所以如果我们有一个装满 5 的树,而我们希望把其中一个换成 6,那我们必须要知道我们究竟是想改变哪个 5。我们也必须知道我们身处在这棵树的哪里。
我们已经看过 Monad 是如何接受具有 context 的值,并如何用函数操作他们 还有如何用 >>= 跟 do 来减轻我们对 context 的关注,集中精神在 value 本身。我们也看过了 Maybe 是如何把值加上一个可能会失败的 context。我们学习到 List Monad 是如何加进多重结果的 context。我们也了解 IO Monad 如何运作,而且我们在知道什么是 Monad 之前就已经知道他了。
当我们第一次谈到 Functor 的时候,我们了解到他是一个抽象概念,代表是一种可以被 map over 的值。然后我们再将其概念提升到 Applicative Functor,他代表一种带有 context 的型态,我们可以用函数操作他而且同时还保有他的 context。在这一章,我们会学到 Monad,基本上他是一种加强版的 Applicative Functor,正如 Applicative Functor 是 Functor 的加强版一样。
Haskell 的一些特色,像是纯粹性,高阶函数,algebraic data types,typeclasses,这些让我们可以从更高的角度来看到 polymorphism 这件事。不像 OOP 当中需要从庞大的型态阶层来思考。我们只需要看看手边的型态的行为,将他们跟适当地 typeclass 对应起来就可以了。像 Int 的行为跟很多东西很像。好比说他可以比较相不相等,可以从大到小排列,也可以将他们一一穷举出来。
在这一章中,我们会检视几个有趣的问题,并尝试用函数式的方式来漂亮地解决他们。我们并不会介绍新的概念,我们只是练习我们刚学到的写程式的技巧。每一节都会探讨不同的问题。会先描述问题,然后用最好的方式解决他。运算逆波兰表示法(Reverse Polish notation form)我们在学校学习数学的时候,我们多半都是用中置(infix)的方式来写数学式。
我们已经说明了 Haskell 是一个纯粹函数式语言。虽说在命令式语言中我们习惯给电脑执行一连串指令,在函数式语言中我们是用定义东西的方式进行。在 Haskell 中,一个函数不能改变状态,像是改变一个变数的内容。(当一个函数会改变状态,我们说这函数是有副作用的。)在 Haskell 中函数唯一可以做的事是根据我们给定的参数来算出结果。
Algebraic Data Types 入门在前面的章节中,我们谈了一些 Haskell 内建的型别和 Typeclass。而在本章中,我们将学习构造型别和 Typeclass 的方法。我们已经见识过许多型别,如 Bool、Int、Char、Maybe 等等,不过在 Haskell 中该如何构造自己的型别呢?好问题,一种方法是使用 data 关键字。
装载模组Haskell 中的模组是含有一组相关的函数,型别和型别类的组合。而 Haskell 程序的本质便是从主模组中引用其它模组并呼叫其中的函数来执行操作。这样可以把程式码分成多块,只要一个模组足够的独立,它里面的函数便可以被不同的程序反复重用。这就让不同的程式码各司其职,提高了程式码的健壮性。
Haskell 中的函数可以作为参数和回传值传来传去,这样的函数就被称作高阶函数。高阶函数可不只是某简单特性而已,它贯穿于 Haskell 的方方面面。要拒绝循环与状态的改变而通过定义问题"是什么"来解决问题,高阶函数必不可少。它们是编码的得力工具。
你好,递回!前面的章节中我们简要谈了一下递回。而在本章,我们会深入地了解到它为何在 Haskell 中是如此重要,能够以递回思想写出简洁优雅的程式码。 如果你还不知道什么是递回,就读这个句子。哈哈!开个玩笑而已!递回实际上是定义函数以呼叫自身的方式。在数学定义中,递回随处可见,如斐波那契数列 (fibonacci)。
模式匹配 (Pattern matching)本章讲的就是 Haskell 那套独特的语法结构,先从模式匹配开始。模式匹配通过检查数据的特定结构来检查其是否匹配,并按模式从中取得数据。在定义函数时,你可以为不同的模式分别定义函数本身,这就让程式码更加简洁易读。你可以匹配一切数据型别 --- 数字,字元,List,元组,等等。我们弄个简单函数,让它检查我们传给它的数字是不是 7。
Type之前我们有说过 Haskell 是 Static Type,这表示在编译时期每个表达式的型别都已经确定下来,这提高了程式码的安全性。若程式码中有让布林值与数字相除的动作,就不会通过编译。这样的好处就是与其让程序在运行时崩溃,不如在编译时就找出可能的错误。Haskell 中所有东西都有型别,因此在编译的时候编译器可以做到很多事情。
准备好了吗?准备来开始我们的旅程!如果你就是那种从不看说明书的人,我推荐你还是回头看一下简介的最后一节。那里面讲了这个教学中你需要用到的工具及基本用法。我们首先要做的就是进入 ghc 的互动模式,接着就可以写几个函数体验一下 Haskell 了。打开终端机,输入 ghci,你会看到下列欢迎讯息:GHCi, version 6.8.2: http://www.haskell.org/ghc/:?
关于这份教学欢迎来到 Haskell 趣学指南!会想看这篇文章表示你对学习 Haskell 有很大的兴趣。你来对地方了,来让我简单介绍一下这个教学。撰写这份教学,一方面是让我自己对 Haskell 更熟练,另一方面是希望能够分享我的学习经验,帮助初学者更快进入状况。网路上已经有无数 Haskell 的教学文件,在我学习的过程中,我并不限于只参考一份来源。
Haskell 是一种标准化的、通用纯函数式编程语言,有非限定性语义和强静态类型。介绍作者通过阅读不同的 Haskell 教学文章,从多个角度出发把这些知识化整为零。这份教学是希望提供更多的机会能让你找到你想要得到的解答。希望能够分享我的学习经验,帮助初学者更快进入状况。
说明简介Reactor 是一个基于 JVM 之上的异步应用基础库。为 Java 、Groovy 和其他 JVM 语言提供了构建基于事件和数据驱动应用的抽象库。Reactor 性能相当高,在最新的硬件平台上,使用无堵塞分发器每秒钟可处理 1500 万事件。
关注时代Java