1
yukirock 2014-11-04 21:09:36 +08:00 1
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]。 |
2
wcp1231 OP |
3
wcp1231 OP |
5
wcp1231 OP @yukirock 也是。。国内 haskell 的社区太少了,我都差点去 irc 问了。。。haskell 还能去哪里交流啊?
|
6
yukirock 2014-11-05 00:07:51 +08:00
@wcp1231 其實我也不清楚……
我上課時倒是可以用課程論壇或者 Facebook,不過說開放的 Haskell 社區我倒不經常去。反正我對這東西的態度是……不做 PL 或者沒人逼你真沒必要幹這個,把 Learn you a Haskell 看一遍長長見識,看看別人關於 Haskell 的讨论(比如说 http://www.zhihu.com/topic/19593103/hot)差不多了。 |
7
ChiangDi 2014-11-05 00:08:20 +08:00 via Android
水木社区的函数式编程板块还是比较活跃的。
|
9
yukirock 2014-11-07 03:07:12 +08:00
@wcp1231 剛剛看別的課件倒是有提到一些知名的 Haskell 社區:
http://shuklan.com/haskell/lec07.html#/0/4 包括 SO,IRC,Reddit 等……雖然我都沒用過就是了。 |