我在用Ruby语言探索函数式编程。以下是我的Ruby版本。我已经在各种函数上进行了测试,包括反转,过滤器,地图等,并且如预期的那样返回结果。但它会改变数据并需要赋值语句。任何人都可以帮助我做到这一点,但不违反功能范式吗?任何人都可以帮助我在底部部分应用咖喱功能吗?我怀疑有什么明显的我失踪了。谢谢。用Ruby折叠和卷曲
fold_l = lambda do |ray, base, funcky|
if ray == []
base
else
base = funcky.call(base,ray.first)
ray.shift
fold_l.call(ray,base,funcky)
end
end
abc = [1, 2, 3, 4, 5, 6, 7]
mapper = lambda {|sum, x| sum << x*x}
lengthy = lambda {|sum, _| sum + 1}
p fold_l.call(abc,[],mapper) ## works fine
p abc ## but mutates data!!
abc = [1, 2, 3, 4, 5, 6, 7]
p curryFold = fold_l.curry.(abc).(0).(lengthy) ## works fine
lengthC = curryFold.(base:0).(funcky:lengthy)
p lengthC.call.(abc) ## but this gives error
感谢您使用'last'的帮助,我注意到'base = funcky.call(base,ray.first)'部分可以放入fold_l调用的第二个参数中以避免赋值语句。咖喱仍然是一个问题。遵循您的建议,我现在在BOTH声明中遇到错误... –
如果这解决了您的问题,那么它就是解决原始问题的方法。如果你还有其他问题,那么值得把这个问题作为一个专注于这个特定角度的新问题来解决。 – tadman
这不仅是“破坏论证的粗鲁”(nice words mithing!),而且我的理解是,函数式编程的一个基本原则是代码不能有副作用,例如参数的变异。 –