基本数据类型 #

一、数值类型 #

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基本数据类型要点:

  1. 数值类型IntIntegerFloatDouble
  2. 布尔类型Bool,值为 TrueFalse
  3. 字符类型Char,单引号包围
  4. 字符串类型String[Char] 的别名
  5. 类型类:定义通用操作,如 EqOrdShowNum
  6. 类型转换:使用 fromIntegralrealToFrac

掌握基本数据类型后,让我们继续学习变量与常量。

最后更新:2026-03-27