欢迎访问宙启技术站
智能推送

在Haskell中实现高阶函数

发布时间:2023-12-10 07:06:57

在Haskell中,高阶函数是将其他函数作为参数或返回值的函数。这使得函数可以像任何其他值一样操作和传递给其他函数。

以下是一些常见的高阶函数的实现以及使用例子:

1. map函数:接受一个函数和一个列表作为参数,并将该函数应用于列表的每个元素,返回新的列表。

myMap :: (a -> b) -> [a] -> [b]
myMap _ [] = []
myMap f (x:xs) = f x : myMap f xs

-- 使用例子
addOne :: Int -> Int
addOne x = x + 1

list = [1, 2, 3, 4]
newList = myMap addOne list -- [2, 3, 4, 5]

2. filter函数:接受一个函数和一个列表作为参数,并返回满足该函数条件的元素组成的列表。

myFilter :: (a -> Bool) -> [a] -> [a]
myFilter _ [] = []
myFilter p (x:xs)
  | p x = x : myFilter p xs
  | otherwise = myFilter p xs

-- 使用例子
evenNumber :: Int -> Bool
evenNumber x = x mod 2 == 0

list = [1, 2, 3, 4]
filtered = myFilter evenNumber list -- [2, 4]

3. foldl和foldr函数:将一个二元函数、一个初始值和一个列表作为参数,将列表中的元素从左到右(foldl)或从右到左(foldr)结合起来,最终返回一个值。

myFoldl :: (b -> a -> b) -> b -> [a] -> b
myFoldl _ acc [] = acc
myFoldl f acc (x:xs) = myFoldl f (f acc x) xs

-- 使用例子
sumList :: [Int] -> Int
sumList = myFoldl (+) 0

list = [1, 2, 3, 4]
sum = sumList list -- 10

4. zipWith函数:接受一个函数和两个列表作为参数,并将该函数应用于两个列表对应位置的元素,返回一个新的列表。

myZipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
myZipWith _ [] _ = []
myZipWith _ _ [] = []
myZipWith f (x:xs) (y:ys) = f x y : myZipWith f xs ys

-- 使用例子
addLists :: [Int] -> [Int] -> [Int]
addLists = myZipWith (+)

list1 = [1, 2, 3]
list2 = [4, 5, 6]
sumList = addLists list1 list2 -- [5, 7, 9]

以上是一些常见的高阶函数的实现和使用例子。借助高阶函数的特性,可以编写更简洁、可复用的代码,提高代码的可读性和可维护性。