data,是对类型的定义
data Bool = False | Truedata Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647data Shape = Circle Float Float Float | Rectangle Float Float Float Float
type,并不是用来创造新类,而是给一个既有类型提供一个别名。
type String = [Char]
instance,用来说明我们要定义某个 typeclass 的instance。当我们要定义 Eq ,我们会写 class Eq a where ,其中 a 代表任何型态。我们可以从 instance 的写法: instance Eq TrafficLight where 看出来。我们会把 a 换成实际的类型。
instance Eq TrafficLight whereRed == Red = TrueGreen == Green = TrueYellow == Yellow = True_ == _ = False
class,定义一个新的 typeclass
class Eq a where(==) :: a -> a -> Bool(/=) :: a -> a -> Boolx == y = not (x /= y)x /= y = not (x == y)class (Functor f ) => Applicative f wherepure :: a -> f a(<*>) :: f (a -> b) -> f a -> f b
newtype,而在 Haskell 中 newtype 正是为了这种情形,我们想将一个类型包在另一个类型中。在实际的函数库中 ZipList a 是这样定义了:
newtype ZipList a = ZipList { getZipList :: [a] }
newtype特点:只能定义单一一个值构造子,而且那个构造子只能有一个字段。
data特点:可以让那个类型有好几个值构造子,并且每个构造子可以有零个或多个字段。