Haskell 獨特的 !!
Operator,可根據 Index 讀取 List,甚至支援 Partial Application。
Version
Haskell for Mac 1.8.2
!! Operator
[1, 2, 3] !! 0
!!
本身是 infix operator,左側為 List,右側為 index。
"Hello" !! 1
String 亦為廣義 List,因此也可使用 !!
。
[1, 2, 3] !! 3
若 index 超過 boundary,會直接出現 error。
Prefix Function
(!!) [1, 2, 3] 0
!!
雖然是 infix operator,也能當成 prefix function,只要將 !!
加上 ()
,之後就如同一般 function 使用。
Partial Application
f = (!!) [1, 2, 3]
既然 (!!)
如同一般 function,自然也支援 partial application。
f = ([1, 2, 3] !!)
Infix 寫法也能使用 partial application,但必須最外層加上 ()
。
f = (!! 2)
f [1, 2, 3]
Infix 寫法也能只針對 index 做 partial application,最外層一樣要加上 ()
。
import Control.Category
f = map(+1) >>> (!! 1)
能對 index 做 partial application 在實務上非常好用,如 >>>
對 List 做 Function Pipeline 時傳遞的是 List,搭配 map()
後可直接繼續接上 (!! 1)
取得 element。
Conclusion
- Haskell 的 infix operator 除了能當成 prefix function 使用外,還支援 partial application,因此可配合 Function Pipeline 使用