在上一篇博客中我们聊了ADT,我们知道了ADT也是关于类型的,我们还和面向对象的class做了比较。此时再看到 type class 这样的词语是非常崩溃的,我的天呐到底还有多少和类型相关的专业词汇。Type 我也认识,Class 我也认识,合到一起又是什么鬼?Type Class 确实又是一个难以理解的概念,我觉得难理解和名字起的不好有很大的关系。词汇真的是匮乏,又不能凭空造一个词出来。但是 Type class 又是必须要理解的一个概念,不然的话可能连 cats 的文档都看不懂。
几乎每一本讲 FP 的书里都会提到 ADT 这个概念,但是好像没有人彻底讲的明白,所以我之前一直不理解。ADT 到底是什么呢?Algebraic 这样的词让人一看就很头疼,写个代码怎么还跟代数产生关系了呢?让我们看看维基百科上的定义:In computer programming, especially functional programming and type theory, an algebraic data type is a kind of composite type, i.e., a type formed by combining other types.
没有什么特殊的,只不过是一种组合类型,由多种其他类型组合而成的类型。Algebraic 是体现在哪里呢?Haskell wiki 是这样描述的:
sum is alternation (A | B, meaning A or B but not both)
product is combination (A B, meaning A and B together)
Algebraic 体现在组合的方式上。把 product 换成 and,sum 换成 or,是不是就容易理解了?product 是 X has an A and a B,sum 则是 X is an A or B。虽然 ADT 看起来很复杂,但其实我们每天都在用,只是没有意识到背后的概念罢了。
The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again.