[心得] functional programming

看板Ruby作者 (godfat 真常)時間18年前 (2007/09/11 22:13), 編輯推噓3(301)
留言4則, 2人參與, 最新討論串1/3 (看更多)
p 幣用完了,來試著賺一點... 已經是我第二次用上了這種作法: def combine left, right; left.zip(right).map{ |e| e.inject &:+ }; end 不過我不禁在想,這樣到底是增進了可讀性與擴充彈性, 抑或是減少可讀性與擴充彈性? 同樣的意思,我想最直接的作法會是: def combine left, right result = [] left.size.times{ |i| result << left[i] + right[i] } result end 相信就算最上面那個看不懂,這個應該是一眼就看得出來了。 不過,zip, map, inject (fold), 這些 function 在 functional programming 根本就是家常便飯,如果跟 fp 熟一點,我想應該是一眼就能看出是什麼意思(吧?) 那麼究竟怎麼寫比較好?相信 java programmer 肯定會說下者 XD 可是對我來說,兩者的暢快感可不能相提並論啊 :p 如果說 combine 要擴充更多的 input, 上者很容易,就這樣: def combine *args; args.shift.zip(*args).map{ |e| e.inject &:+ }; end 沒改幾個字。因為 zip, inject 等操作本身就是模組化的。 可是如果要下者擴充的話,我不是很清楚,但第一個想到的是 meta-programming: def combine *args result = [] args.first.size.times{ |i| values = [] args.size.times{ |j| values << "args[#{j}][i]" } result << eval(values.join('+')) } result end 只是這樣做真的有點蠢,而且效能照理說也不會很理想(沒測過,有人想測嗎?) 而且我覺得這樣複雜度反而比 zip + map + inject 高很多, 像是上面的 args.first.size.times 中的 first 我就差點漏寫了。 any idea? -- Nobody can take anything away from him. Nor can anyone give anything to him. What came from the sea, has returned to the sea. Chrono Cross -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

09/12 13:24, , 1F
我還是習慣下者...因為上者對我來說太長太不人道了...XD
09/12 13:24, 1F

09/12 13:49, , 2F
論程式碼長度是下者比較長啊...XD
09/12 13:49, 2F

09/12 13:58, , 3F
是一行太長XD
09/12 13:58, 3F

09/12 15:22, , 4F
你可以自己拆成好多行啊 XD
09/12 15:22, 4F
文章代碼(AID): #16vgAM0- (Ruby)
討論串 (同標題文章)
文章代碼(AID): #16vgAM0- (Ruby)