Types and Typeclasses
Types
静态类型
类型推导
1> :t 'a'2'a' :: Char3> :t "hello"4"hello" :: [Char] ;; 表示 List5> :t True6True :: Bool7> :t (True, "a")8(True, "a") :: (Bool, [Char]) ;; 表示 Tuple
函数类型
1removeNonUppercase :: String -> String ;; String 等价于 [Char]2removeNonUppercase st = [ c | c <- st, c `elem` ['A' .. 'Z'] ]34addThree :: Int -> Int -> Int -> Int ;; 柯里化,参数之间用 -> 连接5addThree x y z = x + y + z
Int 有限,Integer 无限
1factorial Integer -> Integer2factorial n = product [1 .. n]
Type variables
1> :t head2head :: [a] -> a3> :t fst4fst :: (a, b) -> a ;; a b 不一定是不同的类型
Type classes
定义类型的行为,如果一个类型属于某个 Typeclass,那他必须实现该 Typeclass 所描述的行为
1> :t (==)2(==) :: Eq a => a -> a -> Bool3> :t (>)4(>) :: Ord a => a -> a -> Bool
Eq a 表示 a 这个 type var 必须属于 Eq 这个 typeclass,实现 Eq 的行为
Eq:可判断相等性的类型,提供实现的函数是 == 和 /=
Ord:可比较大小类型,< > <= >=
1> :t show2show :: Show a => a -> String3> :t read4read :: Read a => String -> a5> show True6"True"7> read "5" :: Int85
Show:可用字符串表示的类型
Read:与 Show 相反
1> [LT .. GT]2[LT, EQ, GT]
- Enum:连续的类型
1> :t maxBound2maxBound :: Bounded a => a3> :t minBound4minBound :: Bounded a => a5> minBound :: Int6-92233720368547758087> maxBound :: Int89223372036854775807
- Bounded:有上下限
1> :t (+)2(+) :: Num a => a -> a -> a3> :t 20420 :: Num p => p5> :t fromIntegral6fromIntegral :: (Integral a, Num b) => a -> b7> fromIntegral (length [1, 2, 3]) + 3.286.2
Num:表示数字
Integral:表示整数,包含 Int 和 Integer
Floating:表示浮点,包含 Float 和 Double