點燈坊

失くすものさえない今が強くなるチャンスよ

Haskell 之 !! Operator

Sam Xiao's Avatar 2021-06-09

Haskell 獨特的 !! Operator,可根據 Index 讀取 List,甚至支援 Partial Application。

Version

Haskell for Mac 1.8.2

!! Operator

[1, 2, 3] !! 0

!! 本身是 infix operator,左側為 List,右側為 index。

index000

"Hello" !! 1

String 亦為廣義 List,因此也可使用 !!

index001

[1, 2, 3] !! 3

若 index 超過 boundary,會直接出現 error。

index002

Prefix Function

(!!) [1, 2, 3] 0

!! 雖然是 infix operator,也能當成 prefix function,只要將 !! 加上 (),之後就如同一般 function 使用。

index003

Partial Application

f = (!!) [1, 2, 3]

既然 (!!) 如同一般 function,自然也支援 partial application。

index004

f = ([1, 2, 3] !!)

Infix 寫法也能使用 partial application,但必須最外層加上 ()

index005

f = (!! 2)
f [1, 2, 3]

Infix 寫法也能只針對 index 做 partial application,最外層一樣要加上 ()

index006

import Control.Category

f = map(+1) >>> (!! 1)

能對 index 做 partial application 在實務上非常好用,如 >>> 對 List 做 Function Pipeline 時傳遞的是 List,搭配 map() 後可直接繼續接上 (!! 1) 取得 element。

index007

Conclusion

  • Haskell 的 infix operator 除了能當成 prefix function 使用外,還支援 partial application,因此可配合 Function Pipeline 使用