高階函式的基礎知識

在繼續之前檢視部分應用程式。

在 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))