常用标准库 #

一、Prelude #

1.1 基本函数 #

haskell
-- 身份函数
id :: a -> a
id x = x

-- 常数函数
const :: a -> b -> a
const x _ = x

-- 函数组合
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) x = f (g x)

-- 翻转参数
flip :: (a -> b -> c) -> b -> a -> c
flip f y x = f x y

-- 函数应用
($) :: (a -> b) -> a -> b
f $ x = f x

1.2 列表函数 #

haskell
-- 列表操作
head :: [a] -> a
tail :: [a] -> [a]
last :: [a] -> a
init :: [a] -> [a]

-- 长度
length :: [a] -> Int

-- 判断
null :: [a] -> Bool
elem :: Eq a => a -> [a] -> Bool

-- 取舍
take :: Int -> [a] -> [a]
drop :: Int -> [a] -> [a]

-- 反转
reverse :: [a] -> [a]

-- 高阶函数
map :: (a -> b) -> [a] -> [b]
filter :: (a -> Bool) -> [a] -> [a]
foldl :: (b -> a -> b) -> b -> [a] -> b
foldr :: (a -> b -> b) -> b -> [a] -> b

1.3 布尔函数 #

haskell
-- 逻辑运算
(&&) :: Bool -> Bool -> Bool
(||) :: Bool -> Bool -> Bool
not :: Bool -> Bool

-- 条件
otherwise :: Bool
otherwise = True

1.4 数值函数 #

haskell
-- 基本运算
(+) :: Num a => a -> a -> a
(-) :: Num a => a -> a -> a
(*) :: Num a => a -> a -> a
(/) :: Fractional a => a -> a -> a

-- 其他
negate :: Num a => a -> a
abs :: Num a => a -> a
signum :: Num a => a -> a

-- 整数运算
div :: Integral a => a -> a -> a
mod :: Integral a => a -> a -> a

二、Data.List #

2.1 导入 #

haskell
import Data.List

-- 或选择性导入
import Data.List (sort, nub, group, intersperse)

2.2 排序 #

haskell
import Data.List

-- 排序
sort :: Ord a => [a] -> [a]
sort [3, 1, 4, 1, 5]  -- [1, 1, 3, 4, 5]

-- 自定义排序
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy (flip compare) [1, 2, 3]  -- [3, 2, 1]

-- 排序并分组
sortOn :: Ord b => (a -> b) -> [a] -> [a]
sortOn length ["abc", "de", "fghij"]  -- ["de", "abc", "fghij"]

2.3 去重 #

haskell
-- 去除重复
nub :: Eq a => [a] -> [a]
nub [1, 2, 1, 3, 2]  -- [1, 2, 3]

-- 去除相邻重复
nubBy :: (a -> a -> Bool) -> [a] -> [a]

2.4 分组 #

haskell
-- 分组相邻相同元素
group :: Eq a => [a] -> [[a]]
group [1, 1, 2, 2, 2, 3]  -- [[1, 1], [2, 2, 2], [3]]

-- 自定义分组
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy (\x y -> (x > 0) == (y > 0)) [-1, -2, 1, 2]
-- [[-1, -2], [1, 2]]

2.5 查找 #

haskell
-- 查找元素
find :: (a -> Bool) -> [a] -> Maybe a
find (> 3) [1, 2, 3, 4, 5]  -- Just 4

-- 查找位置
elemIndex :: Eq a => a -> [a] -> Maybe Int
elemIndex 3 [1, 2, 3, 4, 5]  -- Just 2

findIndex :: (a -> Bool) -> [a] -> Maybe Int
findIndex (> 3) [1, 2, 3, 4, 5]  -- Just 3

2.6 其他函数 #

haskell
-- 插入
insert :: Ord a => a -> [a] -> [a]
insert 3 [1, 2, 4, 5]  -- [1, 2, 3, 4, 5]

-- 插入分隔
intersperse :: a -> [a] -> [a]
intersperse ',' "abcde"  -- "a,b,c,d,e"

-- 交错插入
intercalate :: [a] -> [[a]] -> [a]
intercalate ", " ["a", "b", "c"]  -- "a, b, c"

-- 前缀后缀
isPrefixOf :: Eq a => [a] -> [a] -> Bool
isSuffixOf :: Eq a => [a] -> [a] -> Bool
isInfixOf :: Eq a => [a] -> [a] -> Bool

三、Data.Maybe #

3.1 导入 #

haskell
import Data.Maybe

3.2 常用函数 #

haskell
import Data.Maybe

-- 从Maybe取值
fromMaybe :: a -> Maybe a -> a
fromMaybe 0 Nothing   -- 0
fromMaybe 0 (Just 5)  -- 5

-- 可能失败的头
listToMaybe :: [a] -> Maybe a
listToMaybe []     -- Nothing
listToMaybe [1, 2] -- Just 1

-- Maybe转列表
maybeToList :: Maybe a -> [a]
maybeToList Nothing   -- []
maybeToList (Just 5)  -- [5]

-- 过滤Just
catMaybes :: [Maybe a] -> [a]
catMaybes [Just 1, Nothing, Just 2]  -- [1, 2]

-- 映射并过滤
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
mapMaybe (\x -> if x > 0 then Just x else Nothing) [-1, 2, -3, 4]
-- [2, 4]

-- 判断
isJust :: Maybe a -> Bool
isNothing :: Maybe a -> Bool

3.3 使用示例 #

haskell
-- 安全查找
safeHead :: [a] -> Maybe a
safeHead = listToMaybe

-- 安全索引
safeIndex :: [a] -> Int -> Maybe a
safeIndex xs n
    | n < 0 || n >= length xs = Nothing
    | otherwise = Just (xs !! n)

-- 链式操作
process :: Maybe Int -> Maybe Int
process = fmap (*2) . fmap (+1)
-- process (Just 5) = Just 12

四、Data.Either #

4.1 导入 #

haskell
import Data.Either

4.2 常用函数 #

haskell
import Data.Either

-- 处理Either
either :: (a -> c) -> (b -> c) -> Either a b -> c
either show show (Left 42)   -- "42"
either show show (Right "hi") -- "\"hi\""

-- 判断
isLeft :: Either a b -> Bool
isRight :: Either a b -> Bool

-- 转换
lefts :: [Either a b] -> [a]
lefts [Left 1, Right "a", Left 2]  -- [1, 2]

rights :: [Either a b] -> [b]
rights [Left 1, Right "a", Left 2]  -- ["a"]

-- 分区
partitionEithers :: [Either a b] -> ([a], [b])
partitionEithers [Left 1, Right "a", Left 2]
-- ([1, 2], ["a"])

4.3 使用示例 #

haskell
-- 安全除法
safeDiv :: Int -> Int -> Either String Int
safeDiv _ 0 = Left "Division by zero"
safeDiv x y = Right (x `div` y)

-- 链式操作
process :: Either String Int -> Either String Int
process (Left err) = Left err
process (Right x) = Right (x * 2)

-- 使用either处理
handleResult :: Either String Int -> String
handleResult = either ("Error: " ++) ("Result: " ++) . fmap show

五、Data.Char #

5.1 导入 #

haskell
import Data.Char

5.2 常用函数 #

haskell
import Data.Char

-- 大小写转换
toUpper :: Char -> Char
toLower :: Char -> Char
toTitle :: Char -> Char

-- 判断
isDigit :: Char -> Bool
isLetter :: Char -> Bool
isAlpha :: Char -> Bool
isAlphaNum :: Char -> Bool
isUpper :: Char -> Bool
isLower :: Char -> Bool
isSpace :: Char -> Bool

-- 数值转换
digitToInt :: Char -> Int
intToDigit :: Int -> Char

-- ASCII转换
ord :: Char -> Int
chr :: Int -> Char

5.3 使用示例 #

haskell
-- 清理字符串
clean :: String -> String
clean = filter isAlphaNum . map toLower

-- 统计字母
countLetters :: String -> Int
countLetters = length . filter isLetter

-- 首字母大写
capitalize :: String -> String
capitalize [] = []
capitalize (x:xs) = toUpper x : xs

六、Control.Monad #

6.1 导入 #

haskell
import Control.Monad

6.2 常用函数 #

haskell
import Control.Monad

-- 序列
sequence :: Monad m => [m a] -> m [a]
sequence [Just 1, Just 2, Just 3]  -- Just [1, 2, 3]
sequence [Just 1, Nothing, Just 3] -- Nothing

-- 序列并丢弃结果
sequence_ :: Monad m => [m a] -> m ()
sequence_ [print 1, print 2, print 3]  -- 打印 1 2 3

-- 映射后序列
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

-- for循环
forM :: Monad m => [a] -> (a -> m b) -> m [b]
forM_ :: Monad m => [a] -> (a -> m b) -> m ()

-- 条件执行
when :: Monad m => Bool -> m () -> m ()
when True (print "yes")  -- 打印 "yes"
when False (print "no")  -- 不执行

unless :: Monad m => Bool -> m () -> m ()
unless False (print "yes")  -- 打印 "yes"

-- 过滤
filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]

-- 折叠
foldM :: Monad m => (b -> a -> m b) -> b -> [a] -> m b

七、总结 #

常用标准库要点:

  1. Prelude:自动导入,基本函数
  2. Data.List:列表操作,排序、分组、查找
  3. Data.Maybe:Maybe处理,fromMaybe、catMaybes
  4. Data.Either:Either处理,either、partitionEithers
  5. Data.Char:字符操作,大小写、判断、转换
  6. Control.Monad:Monad工具,sequence、forM、when

掌握常用标准库后,让我们继续学习IO操作。

最后更新:2026-03-27