高阶函数的基础知识

在继续之前查看部分应用程序。

在 Haskell 中,可以将其他函数作为参数或返回函数的函数称为高阶函数

以下是所有高阶函数

map       :: (a -> b) -> [a] -> [b]
filter    :: (a -> Bool) -> [a] -> [a]
takeWhile :: (a -> Bool) -> [a] -> [a]
dropWhile :: (a -> Bool) -> [a] -> [a]
iterate   :: (a -> a) -> a -> [a]
zipWith   :: (a -> b -> c) -> [a] -> [b] -> [c]
scanr     :: (a -> b -> b) -> b -> [a] -> [b]
scanl     :: (b -> a -> b) -> b -> [a] -> [b]

这些特别有用,因为它们允许我们通过将函数作为参数传递给其他函数来在我们已有的函数之上创建新函数。因此,名称,高阶函数

考虑:

Prelude> :t (map (+3))
(map (+3)) :: Num b => [b] -> [b]

Prelude> :t (map (=='c'))
(map (=='c')) :: [Char] -> [Bool]

Prelude> :t (map zipWith)
(map zipWith) :: [a -> b -> c] -> [[a] -> [b] -> [c]]

这种轻松创建功能的能力(例如,通过此处使用的部分应用程序)是使功能编程特别强大的功能之一,并允许我们获得简短,优雅的解决方案,否则将在其他语言中使用几十行。例如,以下函数为我们提供了两个列表中对齐元素的数量。

aligned :: [a] ->  [a] -> Int
aligned xs ys = length (filter id (zipWith (==) xs ys))