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

聊聊 functional programming

  •  
  •   madeinclojure · 2015-07-14 19:16:35 +08:00 · 2405 次点击
    这是一个创建于 3412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目的

    通过对fp的学习,发现改变了一些编程的思路,这里对于这方面的讨论比较少,所以抛砖引玉,学习下。

    下面举个例子

    (defn simpfy-piece
      "throw away the unnessesaries"
      [piece]
      [(schema/piece-name-id
        (b/get-state :piece-name-ids)
        (:entity piece)
        (:key piece))
       (:val piece)])
    

    下面是修改之后的代码。

    (defn piece->simple-piece
      "throw away the unnessesaries"
      [piece-name->id]
      (fn [piece]
        [(piece-name->id (:entity piece) (:key piece))
         (:val piece)] ))
    

    其中的变化

    • 大部分pure方法命名都是 a->b,比如piece->simple-piece
    • 返回的方法的参数只有一个。
    • 如果方法有依赖,则在参数中定义,但返回一个pure方法,例如将schema/piece-name-id 这个依赖的方法,通过参数传递进来。
    • 副作用都是在最上层并单独处理。

    问题:

    • 没法做到composition,很多方法都是有多个参数,没法通过组合方法达到目的。
    • 这种做法,下层的代码很容易理解,但是上层的代码就受罪了,大量的内嵌方法调用,层层方法有依赖。如下。
    (defn query
      [clause]
      (query/query->entities
       (query/vindex->entities
        (query/entity-id->entity
         (query/entity-id->pieces
          (idx/entity-id->kindex ref-kindex)
          (store/ids->pieces
           (store/id->piece (fn [entity-name id]
                              (p/get! (b/get-state :pieces-db) id)))))
         (query/pieces->entity (sc/piece-name->id
                                 (b/get-state :piece-name-ids)))))
       {:piece-name->id (sc/piece-name->id (b/get-state :piece-name-ids))
        :piece-name->vindex ref-vindex}))
    

    最后,有没有同学可以分享自己的心得,如何用好functional programming.
    如果能分享代码更好。

    我上面实现的功能比较简单,piece->simple-piece 是将一个map结构的数据,删除掉不需要的部分,同时将里面key为"name"的值转换成id,所以依赖piece-name->id,如果各位来实现,是怎么个思路。

    5 条回复    2015-07-14 19:53:45 +08:00
    jiang42
        1
    jiang42  
       2015-07-14 19:46:05 +08:00 via Android
    看上去
    jiang42
        2
    jiang42  
       2015-07-14 19:46:53 +08:00 via Android
    看上去像clojure,它的尾递归就是灾难
    jiang42
        3
    jiang42  
       2015-07-14 19:47:10 +08:00 via Android
    像clojure,它的尾递归就是灾难
    blacktulip
        4
    blacktulip  
       2015-07-14 19:49:25 +08:00   ❤️ 1
    楼上这是在模拟尾递归?
    jiang42
        5
    jiang42  
       2015-07-14 19:53:45 +08:00 via Android
    @blacktulip nope, 手机回复……我以为没回复上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2783 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.