1.基本typeclass 之间的关系
其中实线箭头表示派生,实线双箭头表示等价,虚线箭头表示其他的含义(作者没说具体是什么),灰色框表示标准库未定义的typeclass。
2.typeclass,instances and laws
----------------------------------------写在typeclass之前---------------------------------------------------
--typeclass是带参数的类型构造方式的一种抽象机制,
--laws是使用该抽象的准则,instance为具象,
--函数声明具体指出了函数实现和数据类型的基本组合方式
--这些组合方式是haskell提供的最基本功能,是组成Haskell所有语法的基石
--更基本的操作需要了解编程语言的设计原理以及lambda表达式
--
--haskell中包括以下几类名字:变量名,类型名,类型变量(参数类型),类型构造子,类型类
--变量名:x,y,z... (不用多说,都懂)
--类型名:Int,Float,...(元素(变量)的具体类型,同时是值构造子)
--类型变量:a,b,c...(类型名参数化,指代的仍为个体)
--类型构造子:Enum,[],(,)...(实际上是集合类型构造子,集合的元素类型由具体类型或者类型变量指出)
--类型类:Functor,Monad... (是上述集合的类型抽象,一个类型类对应一种集合类型,该集合必须实现类型类制定的函数,据说遵守规则好像是靠程序员自觉?)
------------------------------------------------------------------------------------------------------------
--在typeclassopedia原文中类型构造子为小写f m等,为方便理解改成了大写
-- **********************************************
--Functor:
class Functor F where
--F为类型构造子,a,b为类型参数, F a为具体类型,下同
fmap :: (a -> b) -> F a -> F b
--在源代码中看到用了forall来实现fmap,forall的意义?(在hayoo中没有搜到相关的函数)
--laws:
fmap id = id
fmap (g . h) = fmap g . fmap h
--instance:
class Functor F => Pointed F wh