Haskell里面的 Types 和Typeclasses到底是什么东东
Bool、Int、Char、Maybe 这些内建的类型Types我们都知道,其实函数式编程里面只有函数是“头等公民”
我们在过程式语言里熟知的类型在函数式语言里面并不是一成不变的,其实我们完全可以在一个内建类型都没有的基础上把语言大厦建立起来,不相信,看以下Haskell代码
data Bool = False | True
左边的是类型名,右面的就是值"构造子",代表可能的集合。
data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647
左边的是类型名,右面的就是所有整数集合。
够抽象,够一般。
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
值构造子的本质是个函数,可以返回一个类型的值
ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
ghci> :t Rectangle
Rectangle :: Float -> Float -> Float -> Float -> Shape
原来构造子本身就是函数!
surface :: Shape -> Float
surface (Circle _ _ r) = pi * r ^ 2
surface (Rectangle x1 y1 x2 y2) = (abs $ x2 - x1) * (abs $ y2 - y1)
取Shape类型的一个值,返回Float类型的一个值,圆我们用_ 模式匹配不理会前2项.
ghci> surface $ Circle 10 20 10
314.15927
ghci> surface $ Rectangle 0 0 100 100
10000.0