跳轉到內容

另一個 Haskell 教程/語言進階/解答

來自華夏公益教科書,開放的書,開放的世界
Haskell
另一個 Haskell 教程
前言
介紹
入門
語言基礎 (解答)
型別基礎 (解答)
IO (解答)
模組 (解答)
高階語言 (解答)
高階型別 (解答)
單子 (解答)
高階 IO
遞迴
複雜度

節和中綴運算子

[編輯 | 編輯原始碼]

區域性宣告

[編輯 | 編輯原始碼]

部分應用

[編輯 | 編輯原始碼]

函式 func3 無法轉換為無點風格。其他看起來像是

func1 x = map (*x)

func2 f g = filter f . map g

func4 = map (+2) . filter (`elem` [1..10]) . (5:)

func5 = flip foldr 0 . flip . curry 

你可能很想嘗試將 func2 寫成 filter f . map,試圖使用 eta 歸約來去除 g。在這種情況下,這是不可能的。這是因為函式組合運算子 (.) 的型別為 (b -> c) -> (a -> b) -> (a -> c)。在本例中,我們試圖將 map 作為第二個引數使用。但是 map 接受兩個引數,而 (.) 期望一個只接受一個引數的函式。


模式匹配

[編輯 | 編輯原始碼]

例項宣告

[編輯 | 編輯原始碼]

TheEqClass

[編輯 | 編輯原始碼]

TheShowClass

[編輯 | 編輯原始碼]

其他重要類

[編輯 | 編輯原始碼]

TheOrdClass

[編輯 | 編輯原始碼]

TheEnumClass

[編輯 | 編輯原始碼]

TheNumClass

[編輯 | 編輯原始碼]

TheReadClass

[編輯 | 編輯原始碼]

類上下文

[編輯 | 編輯原始碼]

派生類

[編輯 | 編輯原始碼]

資料型別再探

[編輯 | 編輯原始碼]

命名欄位

[編輯 | 編輯原始碼]

更多列表

[編輯 | 編輯原始碼]

標準列表函式

[編輯 | 編輯原始碼]

列表推導式

[編輯 | 編輯原始碼]

有限對映

[編輯 | 編輯原始碼]

列表的最後總結

[編輯 | 編輯原始碼]

我們可以從遞迴定義開始

and [] = True
and (x:xs) = x && and xs

從這裡,我們可以很清楚地將它改寫成

and = foldr (&&) True

我們可以遞迴地寫成

concatMap f [] = []
concatMap f (x:xs) = f x ++ concatMap f xs

這暗示我們可以寫成

concatMap f = foldr (\a b -> f a ++ b) []

現在,我們可以進行點消除得到

     foldr (\a b -> f a ++ b) []
==>  foldr (\a b -> (++) (f a) b) []
==>  foldr (\a -> (++) (f a)) []
==>  foldr (\a -> ((++) . f) a) []
==>  foldr ((++) . f) []
華夏公益教科書