yukirock
2014-11-04 21:09:36 +08:00
rec.tail 是函數複合,形如把 f(g(x)) 寫成 (f . g) x 的形式。一般會寫成點號前後各留一個空格,像 rec . tail 這樣。
這裏這個 foldr 的確是返回一個複合函數。它的意義是,給一個 list,如果這個 list 的開頭有多少個能令 predicate x 爲 True 的 x,就返回一個複合了多少個 tail 的複合函數,然後對參數 list 調用這個複合函數。
這麼說不好理解,舉個例子。
*Main> dropWhile'' (<3) [1,2,3,4,5,4,3,2,1]
[3,4,5,4,3,2,1]
foldr 是從右向左掃,掃到右邊的 1,2 時 accumulator 暫時是 (id . tail . tail);掃到 3 的時候返回 id,相當於 accumulator 清空;再掃到前面的 3 爲止都是 id,掃到前面的 2 時,因爲滿足 predicate x 爲 True,所以返回一個 (id . tail),掃到 1 就變成 (id . tail . tail)。最後就相當於對參數的 list 調用 (id . tail . tail) 這樣一個有兩個 tail 的複合函數。
如果我們在這個 list 前面再加一個令 predicate x 爲 False 的值例如 3,參數給成 [3,1,2,3,4,5,4,3,2,1],那麼這個 foldr 還是和先前一樣從右向左掃,掃到 list 第二位的 1 時爲 (id . tail . tail),然後遇到 3,清空變成 id,dropWhile'' 就變成了 id [3,1,2,3,4,5,4,3,2,1],返回 [3,1,2,3,4,5,4,3,2,1]。