发布于 

map与filter函数

map与filter函数

快两个月没有更Haskell了,最近也一直没有学。现在劳动节放假,趁有时间更一些。

参考书籍: Learn you a Haskell

map

map取一个函数和一个列表作为参数,它会将这个函数应用到这个列表中的每个元素,产生一个新的列表。下面为它的定义:

1
2
3
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

以下为它的几个用法举例:

1
2
3
4
5
6
7
8
ghci> map (+3) [1,5,3,1,6]
[4,8,6,4,9]
ghci> map (++ "!") ("BIFF","BANG","POW"]
["BIFF!","BANG!","POW!"]
ghci> map (replicate 3) [3..6]
[[3,3,3],[4,4,4],[5,5,5],[6,6,6]]
ghci> map fst [(1,2),(3,5),(6,3),(2,6),(2,5)]
[1,3,6,2,2]

filter

filter函数取一个谓词(preddicate)和一个列表,返回有列表中所有符合该条件的元素组成的列表(谓词指的是返回布尔值的函数)。其实现大致如下:

1
2
3
4
5
filter :: (a -> Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
true| p x = x : filter p xs
| otherwise = filter p xs

下面是一些相关的示例:

1
2
3
4
5
6
ghci> filter even [1..10]
[2,4,6,8,10]
ghci> let notNull x = not (null x) in filter notNull [[1,2,3],[],[3,4,5],[2,2],[],[],[]]
[[1,2,3],[3,4,5],[2,2]]
ghci> filter ('elem' ['a'..'z']) "u LaUgH aT mE BeCaUsE I aM diFfeRent"
"uagameasadifeent"

此外,我们还可以使用filter实现之前的快速排序:

1
2
3
4
5
6
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
truelet smallerOrEqual = filter (<= x) xs
larger = filter (> x) xs
in quicksort smallerOrEqual ++ [x] ++ quicksort larger

takeWhile

takeWhile函数取一个谓词和一个列表作为参数,然后从头开始遍历列表,然后一旦遇到不符合条件的元素,它就会停止执行,并返回结果列表。其实现大致如下:

1
2
3
4
5
takeWhile :: (a -> Bool) -> [a] -> [a]
takeWhile _ [] = []
takeWhile f (x:xs)
true| f x = f x : takeWhile f xs
| otherwise = []

其示例用法:

1
2
3
4
ghci> takeWhile (/=' ')"elephants know how to party"
"elephants"
ghci> sum (takeWhile (<10000) (filter odd (map (^2) [1..] )))
166650


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。