跳转至

类型

基本类型

类型 描述
Int 64 位整数.
Word 64 位无符号整数.
Integer 任意大小整数.
Float 32 位浮点数.
Double 64 位浮点数.
Char 一个 Unicode 字符.
Bool

聚合类型

  • 元组 (Tuple).
  • 列表 (List).
  • Tagged union.

在 GHCi 中, 可以使用 :type:t 查看表达式的类型:

ghci> :t min
min :: Ord a => a -> a -> a

类型注释

Haskell 允许通过关键字 ::[^::] 为表达式添加类型签名 (type signature) 注释:

expr :: <type>
ghci> [1, 2, 3] :: [Integer]
[1,2,3]

可以利用该语法为函数 in_range 添加类型签名:

in_range :: Integer -> Integer -> Integer -> Bool
in_range min max x = min <= x && x <= max

in_range 函数只能接受 Integer 类型的参数.

也可以使用该语法判断表达式的类型:

ghci> [True] :: [Bool]
[True]
ghci> _ = min :: Ord a => a -> a -> a

类型多态 (Type polymorphism)

Haskell 是强类型的 (strongly typed), 但部分函数 (如 fst) 却支持不同类型的参数:

ghci> fst ('a', False)
'a'
ghci> fst (1, 2.0)
1

这是通过类型多态实现的, fst 函数的类型签名为: fst :: (a, b) -> a.
其中的 ab 是类型变量, (a, b) 表示接受一个包含任意类型的二元组参数, 返回值必须与该二元组的第一个元素类型相同.

类型类 (Type class)

Haskell 的类型类类似于 Rust 的特征 (Trait).

类型类用于为多态类型添加限制.

ghci> :t div
div :: Integral a => a -> a -> a
ghci> :t (/)
(/) :: Fractional a => a -> a -> a
ghci> 5 `div` 2
2
ghci> 5 / 2    
2.5

因为 Haskell 不支持隐式类型转换, 意味着上面代码中的数字 52 同时满足 IntegralFractional 两个限制.
这是因为 Haskell 中的数字默认是 Num 类型类, 在具体使用时才会转换为合适的具体类型.

ghci> :t 1
1 :: Num a => a

在 GHCi 中, 可以使用 :info:i 查看类型类的类信息:

ghci> :i Num
type Num :: * -> Constraint
class Num a where
  (+) :: a -> a -> a
  (-) :: a -> a -> a
  (*) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
  {-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-}
        -- Defined in `GHC.Num'
instance Num Double -- Defined in `GHC.Float'
instance Num Float -- Defined in `GHC.Float'
instance Num Int -- Defined in `GHC.Num'
instance Num Integer -- Defined in `GHC.Num'
instance Num Word -- Defined in `GHC.Num'

添加新类型

  • type: 为类型指定别名.
  • data: 创建新的类型.

数据类型 (Data type)

Haskell 中的 Tagged union 数据类型, 与 Rust 当中的枚举类型 (Enumerated types) 相似.

data Option a = None | Some(a)
  deriving (Eq, Show)

可以使用 deriving 为类型自动添加指定类类型的实现, 与 Rust 中的 derive 宏相似.

类型别名

可以使用 type1 关键字为类型添加别名, 也被称为类型同义词 (type synonyms).

type String = [Char]

评论