类型
基本类型
类型 | 描述 |
---|---|
Int |
64 位整数. |
Word |
64 位无符号整数. |
Integer |
任意大小整数. |
Float |
32 位浮点数. |
Double |
64 位浮点数. |
Char |
一个 Unicode 字符. |
Bool |
聚合类型
- 元组 (Tuple).
- 列表 (List).
- Tagged union.
在 GHCi 中, 可以使用 :type
或 :t
查看表达式的类型:
类型注释
Haskell 允许通过关键字 ::
[^::] 为表达式添加类型签名 (type signature) 注释:
可以利用该语法为函数 in_range
添加类型签名:
该 in_range
函数只能接受 Integer
类型的参数.
也可以使用该语法判断表达式的类型:
类型多态 (Type polymorphism)
Haskell 是强类型的 (strongly typed), 但部分函数 (如 fst
) 却支持不同类型的参数:
这是通过类型多态实现的, fst
函数的类型签名为: fst :: (a, b) -> a
.
其中的 a
和 b
是类型变量, (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 不支持隐式类型转换, 意味着上面代码中的数字 5
和 2
同时满足 Integral
和 Fractional
两个限制.
这是因为 Haskell 中的数字默认是 Num
类型类, 在具体使用时才会转换为合适的具体类型.
在 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) 相似.
可以使用 deriving
为类型自动添加指定类类型的实现, 与 Rust 中的 derive
宏相似.
类型别名
可以使用 type
1 关键字为类型添加别名, 也被称为类型同义词 (type synonyms).