一段 Haskell 代码求助!

2014-11-04 17:38:41 +08:00
 wcp1231
昨天看到这个博客 http://www.lazzaro.com.ar/#/archive/83103005589 ,前一半还能看懂,到后面就不行了,我是小白刚刚入门 Haskell,请各位大大们讲解一下。。

let dropWhile'' predicate list= (foldr (\x rec -> if precidate x then rec.tail else id) id list) list

不明白的地方有两个, rec.tail 是啥意思?应该不是过程式语言的调用吧。。
另一个是 (foldr (\x rec -> if precidate x then rec.tail else id) id list) 这段 foldr 不会是返回一个包含函数的 list 然后作用到最后的那个 list 上吧?有这种语法?

谢谢给位大大了!
5849 次点击
所在节点    Haskell
10 条回复
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]。
wcp1231
2014-11-04 21:24:16 +08:00
@yukirock 我发在冷门节点没上首页居然回复了!太感谢了!

我仔细看才发现, rec 一开始是 `id` 我一直以为是 [ id ] 。。。囧。。。都明白了。。。
wcp1231
2014-11-04 21:52:39 +08:00
@yukirock 对了,后一行的

recr base combine (x:xs) = f x xs (recr base combine xs)

f 是怎么来的?
yukirock
2014-11-04 22:39:25 +08:00
@wcp1231 這我就不知道了,我估計他寫錯了……

那個 lambda 裏面 predicate 他不就拼錯了麼 orz
wcp1231
2014-11-04 23:27:35 +08:00
@yukirock 也是。。国内 haskell 的社区太少了,我都差点去 irc 问了。。。haskell 还能去哪里交流啊?
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)差不多了。
ChiangDi
2014-11-05 00:08:20 +08:00
水木社区的函数式编程板块还是比较活跃的。
wcp1231
2014-11-05 10:37:34 +08:00
@yukirock
@ChiangDi 好的!
yukirock
2014-11-07 03:07:12 +08:00
@wcp1231 剛剛看別的課件倒是有提到一些知名的 Haskell 社區:

http://shuklan.com/haskell/lec07.html#/0/4

包括 SO,IRC,Reddit 等……雖然我都沒用過就是了。
wcp1231
2014-11-07 11:01:03 +08:00
@yukirock 多谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/143923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX