Skip to content

AHABHGK

Types and Typeclasses

Types

静态类型

类型推导

1> :t 'a'
2'a' :: Char
3> :t "hello"
4"hello" :: [Char] ;; 表示 List
5> :t True
6True :: Bool
7> :t (True, "a")
8(True, "a") :: (Bool, [Char]) ;; 表示 Tuple

函数类型

1removeNonUppercase :: String -> String ;; String 等价于 [Char]
2removeNonUppercase st = [ c | c <- st, c `elem` ['A' .. 'Z'] ]
3
4addThree :: Int -> Int -> Int -> Int ;; 柯里化,参数之间用 -> 连接
5addThree x y z = x + y + z

Int 有限,Integer 无限

1factorial Integer -> Integer
2factorial n = product [1 .. n]

Type variables

1> :t head
2head :: [a] -> a
3> :t fst
4fst :: (a, b) -> a ;; a b 不一定是不同的类型

Type classes

定义类型的行为,如果一个类型属于某个 Typeclass,那他必须实现该 Typeclass 所描述的行为

1> :t (==)
2(==) :: Eq a => a -> a -> Bool
3> :t (>)
4(>) :: Ord a => a -> a -> Bool

Eq a 表示 a 这个 type var 必须属于 Eq 这个 typeclass,实现 Eq 的行为

  • Eq:可判断相等性的类型,提供实现的函数是 == 和 /=

  • Ord:可比较大小类型,< > <= >=

1> :t show
2show :: Show a => a -> String
3> :t read
4read :: Read a => String -> a
5> show True
6"True"
7> read "5" :: Int
85
  • Show:可用字符串表示的类型

  • Read:与 Show 相反

1> [LT .. GT]
2[LT, EQ, GT]
  • Enum:连续的类型
1> :t maxBound
2maxBound :: Bounded a => a
3> :t minBound
4minBound :: Bounded a => a
5> minBound :: Int
6-9223372036854775808
7> maxBound :: Int
89223372036854775807
  • Bounded:有上下限
1> :t (+)
2(+) :: Num a => a -> a -> a
3> :t 20
420 :: Num p => p
5> :t fromIntegral
6fromIntegral :: (Integral a, Num b) => a -> b
7> fromIntegral (length [1, 2, 3]) + 3.2
86.2
  • Num:表示数字

  • Integral:表示整数,包含 Int 和 Integer

  • Floating:表示浮点,包含 Float 和 Double