基本数据类型 #
一、数值类型 #
1.1 整数类型 #
Haskell提供多种整数类型:
| 类型 | 描述 | 范围 |
|---|---|---|
Int |
固定精度整数 | 平台相关(通常64位) |
Integer |
任意精度整数 | 无限 |
Word |
无符号整数 | 平台相关 |
haskell
-- Int类型
a :: Int
a = 42
-- Integer类型(可以很大)
b :: Integer
b = 123456789012345678901234567890
-- Word类型(无符号)
c :: Word
c = 100
1.2 浮点类型 #
haskell
-- Float(单精度)
piApprox :: Float
piApprox = 3.14159
-- Double(双精度,更常用)
precisePi :: Double
precisePi = 3.141592653589793
-- 科学计数法
bigNumber :: Double
bigNumber = 1.5e10 -- 15000000000.0
smallNumber :: Double
smallNumber = 1.5e-3 -- 0.0015
1.3 有理数 #
haskell
import Data.Ratio
-- 有理数
half :: Rational
half = 1 % 2
third :: Rational
third = 1 % 3
-- 精确计算
sumRational = half + third -- 5 % 6
1.4 Num类型类 #
所有数值类型都属于 Num 类型类:
haskell
-- Num类方法
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
-- 多态数值
x :: Num a => a
x = 42 -- 可以是Int、Integer、Double等
二、布尔类型 #
2.1 布尔值 #
haskell
-- 布尔类型
flag :: Bool
flag = True
isFalse :: Bool
isFalse = False
2.2 布尔运算 #
haskell
-- 逻辑运算
andExample :: Bool
andExample = True && False -- False
orExample :: Bool
orExample = True || False -- True
notExample :: Bool
notExample = not True -- False
2.3 比较运算 #
haskell
-- 比较产生Bool
eq :: Bool
eq = 5 == 5 -- True
neq :: Bool
neq = 5 /= 3 -- True
lt :: Bool
lt = 3 < 5 -- True
gt :: Bool
gt = 5 > 3 -- True
2.4 条件表达式 #
haskell
-- if-then-else
absolute :: Int -> Int
absolute x = if x >= 0 then x else -x
-- 使用布尔函数
isEven :: Int -> Bool
isEven x = x `mod` 2 == 0
isOdd :: Int -> Bool
isOdd = not . isEven
三、字符类型 #
3.1 字符字面量 #
haskell
-- Char类型
letter :: Char
letter = 'a'
digit :: Char
digit = '7'
symbol :: Char
symbol = '@'
3.2 转义字符 #
haskell
newline :: Char
newline = '\n'
tab :: Char
tab = '\t'
backslash :: Char
backslash = '\\'
singleQuote :: Char
singleQuote = '\''
-- Unicode字符
chinese :: Char
chinese = '中'
-- Unicode码点
heart :: Char
heart = '\9829' -- ♥
3.3 字符函数 #
haskell
import Data.Char
-- 大小写转换
upper :: Char -> Char
upper = toUpper
lower :: Char -> Char
lower = toLower
-- 判断函数
isLetter :: Char -> Bool
isLetter = Data.Char.isLetter
isDigit :: Char -> Bool
isDigit = Data.Char.isDigit
isAlpha :: Char -> Bool
isAlpha = Data.Char.isAlpha
isSpace :: Char -> Bool
isSpace = Data.Char.isSpace
3.4 字符与数值转换 #
haskell
import Data.Char
-- 字符转数值
charToInt :: Char -> Int
charToInt c = ord c -- 'A' -> 65
-- 数值转字符
intToChar :: Int -> Char
intToChar n = chr n -- 65 -> 'A'
-- 数字字符转数值
digitToInt :: Char -> Int
digitToInt '5' = 5
-- 数值转数字字符
intToDigit :: Int -> Char
intToDigit 5 = '5'
四、字符串类型 #
4.1 字符串基础 #
在Haskell中,String 是 [Char] 的类型别名:
haskell
type String = [Char]
-- 字符串字面量
greeting :: String
greeting = "Hello, World!"
-- 空字符串
empty :: String
empty = ""
4.2 字符串操作 #
haskell
-- 拼接
hello :: String
hello = "Hello" ++ " " ++ "World"
-- 反转
reversed :: String
reversed = reverse "hello" -- "olleh"
-- 长度
len :: Int
len = length "hello" -- 5
-- 取字符
first :: Char
first = head "hello" -- 'h'
-- 取子串
take3 :: String
take3 = take 3 "hello" -- "hel"
drop2 :: String
drop2 = drop 2 "hello" -- "llo"
4.3 字符串转换 #
haskell
-- 数值转字符串
numToStr :: Int -> String
numToStr = show
-- 字符串转数值
strToNum :: String -> Int
strToNum = read
-- 安全转换
readMaybe :: Read a => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
4.4 多行字符串 #
haskell
-- 使用转义
multiLine :: String
multiLine = "Line 1\nLine 2\nLine 3"
-- 使用反引号(GHC扩展)
{-# LANGUAGE OverloadedStrings #-}
multiLine' :: String
multiLine' = unlines
[ "Line 1"
, "Line 2"
, "Line 3"
]
4.5 高效字符串类型 #
对于性能敏感的场景,使用更高效的字符串类型:
haskell
import qualified Data.Text as T
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
-- Text(Unicode字符串)
textStr :: T.Text
textStr = T.pack "Hello"
-- ByteString(二进制数据)
byteStr :: B.ByteString
byteStr = BC.pack "Hello"
五、类型类概览 #
5.1 常用类型类 #
| 类型类 | 描述 | 主要方法 |
|---|---|---|
Eq |
相等比较 | ==, /= |
Ord |
有序比较 | <, >, <=, >=, compare |
Show |
转字符串 | show |
Read |
从字符串读 | read |
Num |
数值运算 | +, -, * |
Integral |
整数运算 | div, mod |
Fractional |
分数运算 | / |
Enum |
枚举 | succ, pred, toEnum, fromEnum |
Bounded |
有界 | minBound, maxBound |
5.2 类型类约束 #
haskell
-- Eq约束
isEqual :: Eq a => a -> a -> Bool
isEqual x y = x == y
-- Ord约束
maxOfThree :: Ord a => a -> a -> a -> a
maxOfThree x y z = max x (max y z)
-- Num约束
double :: Num a => a -> a
double x = x * 2
-- 多重约束
sumAndShow :: (Num a, Show a) => a -> a -> String
sumAndShow x y = show (x + y)
5.3 类型类继承 #
haskell
-- Num继承结构
class Num a where ...
class (Num a) => Fractional a where ...
class (Fractional a) => Floating a where ...
-- Ord继承Eq
class (Eq a) => Ord a where ...
六、类型转换 #
6.1 显式转换 #
haskell
-- 整数转换
intToInteger :: Int -> Integer
intToInteger = toInteger
integerToInt :: Integer -> Int
integerToInt = fromInteger
-- 浮点转换
intToDouble :: Int -> Double
intToDouble = fromIntegral
doubleToInt :: Double -> Int
doubleToInt = round -- 或 floor, ceiling, truncate
6.2 fromIntegral #
fromIntegral 用于整数类型之间的转换:
haskell
-- 类型签名
fromIntegral :: (Integral a, Num b) => a -> b
-- 示例
intToFloat :: Int -> Float
intToFloat = fromIntegral
intToDouble :: Int -> Double
intToDouble = fromIntegral
-- 实际使用
average :: [Int] -> Double
average xs = fromIntegral (sum xs) / fromIntegral (length xs)
6.3 realToFrac #
realToFrac 用于实数到分数的转换:
haskell
-- 类型签名
realToFrac :: (Real a, Fractional b) => a -> b
-- 示例
floatToDouble :: Float -> Double
floatToDouble = realToFrac
七、类型推断 #
7.1 自动推断 #
Haskell会自动推断类型:
haskell
-- 编译器推断类型
add x y = x + y
-- 推断为:Num a => a -> a -> a
multiply x y = x * y
-- 推断为:Num a => a -> a -> a
isEqual x y = x == y
-- 推断为:Eq a => a -> a -> Bool
7.2 类型默认 #
当类型模糊时,Haskell使用默认类型:
haskell
-- 默认规则
-- Num类型默认为Integer
-- Fractional类型默认为Double
number = 42 -- 默认为Integer
decimal = 3.14 -- 默认为Double
八、总结 #
Haskell基本数据类型要点:
- 数值类型:
Int、Integer、Float、Double - 布尔类型:
Bool,值为True或False - 字符类型:
Char,单引号包围 - 字符串类型:
String是[Char]的别名 - 类型类:定义通用操作,如
Eq、Ord、Show、Num - 类型转换:使用
fromIntegral、realToFrac等
掌握基本数据类型后,让我们继续学习变量与常量。
最后更新:2026-03-27