跳转至

列表

Haskell 中的列表是通过单项链表实现的.

基础操作

从头部添加元素

可以利用构造运算符添加元素到列表的头部:

ghci> 1 : 2 : 3 : []
[1,2,3]

合并列表

ghci> [1, 2] ++ [3, 4]
[1,2,3,4]

追加元素

ghci> x = 3
ghci> [1, 2] ++ [x]
[1,2,3]

常用函数

ghci> head [1, 2, 3]
1
ghci> tail [1, 2, 3]
[2,3]
ghci> length [1, 2, 3]
3
ghci> init [1, 2, 3]
[1,2]
ghci> null [1, 2, 3]
False
ghci> null []
True
ghci> and [True, False, True]
False
ghci> or [True, False, True]
True

字符串

与 C 语言类似, Haskell 中的字符串是由字符组成的列表.

ghci> ['h', 'i']
"hi"
ghci> "hello" ++ " world!"
"hello world!"

列表推导(List comprehension)

列表推导类似数学中的集合建构式符号(set-builder notation).

[ <gen> | <elem> <- <list>, ..., <guard>, ... ]

习题

1

创建函数 elem, 如果指定元素在列表中返回 True, 否则返回 False.

elem :: (Eq a) => a -> [a] -> Bool
elem e [] = False
elem e (x:xs) = (e == x) || (elem e xs)

2

创建函数 nub, 移除指定列表中的全部重复元素.

nub :: (Eq a) => [a] -> [a]
nub [] = []
nub (x:xs)
  | elem x xs = nub xs
  | otherwise = x : nub xs

3

创建函数 isAsc, 如果指定列表成升序排列返回 True.

isAsc :: [Int] -> Bool
isAsc [_] = True
isAsc (x:y:xs) = (x <= y) && isAsc (y : xs)

评论