第五章:常用的高階函式和函式的補充語法
1.應用函式$和&
$和&函式的作用在於把左邊和右邊的表示式都加上括號,他們的應用在於它的優先順序較低,因此可以簡化寫出極簡卻又複雜的程式碼,應該注意的是$是右結合的,&是左結合的。
($) :: (a -> b) -> a -> b
f $ x = f x
infixr 0 $
(&) :: (a -> b) -> a -> b
x $ f = f x
infixr 1 &
f (g (k x))
--相當於
f $ g $ k x
x & k & g & f
map ($ 3) [(4+),(10*),(^2),sqrt]
2.匿名函式(lambda)
匿名函式,顧名思義,即使用的函式沒有名字,只用一個表示式來表示,常用於臨時使用一次的情形
\pattern1 pattern2 ... -> expression
3 & (\x -> x + 1) & (\x -> x ^ 2)
4 6 & (\x y -> x + y) & (\x -> x ^ 2)
3.組合函式.(compose)
數學上常稱為複合函式,常和$一起使用
(.) ::(b - > c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
infixr 9 .
toEnum . (+1) . fromEnum $ 'a' :: Char
4.函式的補充語法
-- where, let
let x = y where y = 4 in x ^ 2
let y = 6 in y ^ 3
-- guard
isListLong xs
| l < 10 = "This list is not long"
| l < 100 = "This list is long"
| l > 1000 = "This list is very long"
where
l = length xs
-- MultiwatIf
--原始碼中須在頂部加入如下來擴充套件
{-# LANGUAGE MultiWayIf #-}
if | ... -> ...
| ... -> ...
--相當於
case () of ...
| ... -> ...
| ... -> ...
--GHCi中擴充套件開啟方法
Prelude> :Set -XMultiWayIf
Prelude> if | False -> 2 | otherwise -> 3;
- Point free
eta-conversion,伊塔轉換,它指的是個下面的兩個繫結是等價的,可以相互轉換
g x = f x
g = f
例如計算下一個字母的函式nextChar
nextChar :: Char -> Char
nextChar = toEnum . (+1) . fromEnum
nextChar :: Char -> Char
nextChar c = toEnum . (+1) . fromEnum $ c
上述兩種定義是等價的,第一種稱為point-free style,第二種為point-full style
6.黑魔法詞彙表
- saturated(飽和), fully applied(完全應用)指函式呼叫時接收全部的引數,從而進入可以求值的狀態
- arity(引數數量),如+的arity是2,zipWith的是3
- nullart/unary/binary/ternary(零元/一元)
- closure(閉包),指函式體裡引用了外圍作用域中的自由變數的函式
- combinator (自由函式),不包含自由變數 的函式
相關文章
- Python 函式進階-高階函式Python函式
- Python技法3:匿名函式、回撥函式和高階函式Python函式
- Kotlin 函式6 - 高階函式Kotlin函式
- 高階函式的使用函式
- 探索MySQL高階語句(數學函式、聚合函式、字串函式、日期時間函式)MySql函式字串
- 高階函式函式
- 【碼上開學】Kotlin 的高階函式、匿名函式和 Lambda 表示式Kotlin函式
- Python函數語言程式設計-高階函式、匿名函式、裝飾器、偏函式Python函數程式設計函式
- Kotlin——高階篇(二):高階函式詳解與標準的高階函式使用Kotlin函式
- Kotlin中的高階函式Kotlin函式
- hive常用的一些高階函式彙總Hive函式
- JS高階函式-函式柯里化JS函式
- Javascript 高階函式JavaScript函式
- 函式高階玩法函式
- Kotlin高階函式Kotlin函式
- oracle 高階函式Oracle函式
- python高階函式Python函式
- Python 函數語言程式設計 – 高階函式Python函數程式設計函式
- 從高階函式--->高階元件函式元件
- javascript高階函式的介紹JavaScript函式
- Python中函式的高階使用Python函式
- 理解 JavaScript 中的高階函式JavaScript函式
- C語言中函式printf()和函式scanf()的用法C語言函式
- JavaScript 函式語法JavaScript函式
- shell高階-----建立函式函式
- javaScript高階級函式JavaScript函式
- python- 函式高階Python函式
- Javscript 高階函式(上)函式
- C語言常用函式C語言函式
- SQL中常用的字串LEFT函式和RIGHT函式詳解!SQL字串函式
- Python中的高階函式簡介Python函式
- 【重溫基礎】JS中的常用高階函式介紹JS函式
- 【C語言】常用的字串函式及相關函式的自我實現C語言字串函式
- iOS-GCD常用函式和柵欄函式iOSGC函式
- 常用的Css函式CSS函式
- python的常用函式Python函式
- Js常用的函式JS函式
- 『無為則無心』Python函式 — 33、高階函式Python函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter