level 10
很多人觉得haskell的精髓在于monad,在于副作用控制。
然而语言发展的现状说明了这种副作用处理方式是不直观的。而关于monad的说法,虽然不能算错,但monad transformer说明了这种方式是有极限的。
但是,haskell仍然是一门具有重要历史地位的语言,为什么这么说?
其实并不是因为它导致了多少学术成果,至少在现阶段,haskell最大的意义是:它的语言特性启示了之后大量重要的现代语言,其中最重要的莫过于type class。
楼下细说
2021年11月23日 13点11分
1
level 10
我们先介绍type class是什么?
它其实是对于单个类型,或者多类型之间关系的“准确描述”。
有一个简单的typeclass叫Eq,表示equality性质。Eq可以修饰一个类型参数,表示这个类型参数对应的类型,是可以拿来做等于和不等于运算的。
Eq Int,Eq Bool,表示Int类型和Bool类型都可以做==和/=(忘了是\=还是/=了,不等于的意思)
那么问题来了,凭什么用Eq修饰一个类型,它就可以做等于运算了呢?
答案就是:typeclass的实现
2021年11月23日 13点11分
2
level 10
typeclass的实现(instance/implementation),在Eq这个例子上,就是为Eq所修饰的类型实现等于方法和不等于方法。
haskell可以默认实现一组最小实现,即实现等于和不等于中的一个,自动生成另一个。这和理解typeclass无关,让我们忽略这个语言特性
2021年11月23日 13点11分
3
level 10
实际上,你完全可以把一个typeclass理解成一个datatype,而一个implementation,则是这个datatype的一个实例。
Eq a是一个record,它有两个字段,都是a -> a -> Bool的函数。
实现过的Eq a的instance,都可以作为之后typeclass instance 搜索的依据。
啥叫instance搜索?
这需要举一个例子,最简单的,ad-hoc polymorphic的等于函数 ==
整数做等于,我们会搜索一个Eq Int的instance;布尔值做等于,我们会都搜索一个Eq Bool的instance
==的类型签名是 forall a. Eq a => a -> a -> Bool
而那个Eq a =>,则表示这个Eq a的实例是从可见的作用域搜索得到的,并且是最specific的instance
2021年11月23日 13点11分
4