作者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