作者godfat (godfat 真常)
看板Ruby
標題[心得] functional programming
時間Tue Sep 11 22:13:37 2007
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
1F:推 janyfor:我還是習慣下者...因為上者對我來說太長太不人道了...XD 09/12 13:24
2F:推 godfat:論程式碼長度是下者比較長啊...XD 09/12 13:49
3F:推 janyfor:是一行太長XD 09/12 13:58
4F:→ godfat:你可以自己拆成好多行啊 XD 09/12 15:22