V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wcp1231
V2EX  ›  Haskell

一段 Haskell 代码求助!

  •  
  •   wcp1231 · 2014-11-04 17:38:41 +08:00 · 6099 次点击
    这是一个创建于 3700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天看到这个博客 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 上吧?有这种语法?

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

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

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

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

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

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

    包括 SO,IRC,Reddit 等……雖然我都沒用過就是了。
    wcp1231
        10
    wcp1231  
    OP
       2014-11-07 11:01:03 +08:00
    @yukirock 多谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.