我在用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!),而且我的理解是,函數式編程的一個基本原則是代碼不能有副作用,例如參數的變異。 –