第五章:常用的高階函式和函式的補充語法

夢飛發表於2017-02-24

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 (自由函式),不包含自由變數 的函式

相關文章