数据和函数都有类型
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
ghci> :t True
True :: Bool
ghci> :t "HELLO!"
"HELLO!" :: [Char]
Typeclass (类型类): 用 class 关键字定义, 定义其行为, 可理解为接口
Num 是表示数字的 Typeclass,它的成员类型都具有数字的特征。
Integral 同样是表示数字的 Typeclass。Num 包含所有的数字:实数和整数。而 Integral 仅包含整数,其中的成员类型有 Int 和 Integer
Floating 仅包含浮点类型:Float 和 Double。
有个函数在处理数字时会非常有用,它便是 fromIntegral。其类型声明为: fromIntegral :: (Num b, Integral a) => a -> b。fromIntegral 的类型声明中用到了多个类型约束。如你所见,只要将多个类型约束放到括号里用逗号隔开即可。
Kind
类型构造子接受其他类型作为他的参数,来构造出一个具体类型。这样的行为会让我们想到函数(值构造子,也是函数),也是接受一个值当作参数,并回传另一个值。(函数也是值的一种,我们可以把他们传来传去)
类型也有他们自己的标签,叫做 kind。kind 是类型的类型 (一个 * 代表这个类型是具体类型)
类型构造子接受其他类型作为他的参数,来构造出一个具体类型。这样的行为会让我们想到函数(值构造子,也是函数),也是接受一个值当作参数,并回传另一个值。(函数也是值的一种,我们可以把他们传来传去)
类型也有他们自己的标签,叫做 kind。kind 是类型的类型 (一个 * 代表这个类型是具体类型)
ghci> :k Int Int :: *
ghci> :k Maybe Maybe :: * -> *
ghci> :k Maybe Int Maybe Int :: *
ghci> :k Either Either :: * -> * -> *