我有兩個函數是純函數的組成部分。 第一個函數需要一個包裹,建立在其上的房屋,並拍攝一張照片來宣傳它在一本雜誌:如何在函數式語言中編寫純函數時避免不必要的計算?
let buildAndAdvertiseHouse parcel =
parcel
|> inspect
|> buildWalls
|> buildRoof
|> takePhoto
|> advertise
第二個功能還需要一個包裹,建立在其上的房屋,並增加了一個整理觸摸它:
let buildAndCompleteHouse parcel =
parcel
|> inspect
|> buildWalls
|> buildRoof
|> paintWalls
|> addFurniture
很明顯,這兩個函數也是純粹的,因爲它們是純函數的組合。現在我有一個包裹,比如說niceParcel
,我想將這兩個功能都應用到它。但是,我想避免前三個子函數計算兩次,因爲它們需要很長的時間進行計算,並且它們在兩個函數之間共享。
我該如何重構我的代碼,以避免這些不必要的計算,同時保持這些具有明確含義的漂亮的純函數?
如果'parcel'不是泛型類型,那麼您可以使用'let buildAnd ... = inspect >> buildWalls >> ... >> advertise'(以及合適的縮進)使代碼更具地道性 –
關於這個問題,爲什麼不把你的兩個函數分成三個函數:'build','advertise'和'completeHouse'? –
它們形成一個可用於程序不同部分的實體。當然,他們可以分裂,但是這個實體是失敗的。在這種情況下,如果你想使用它們,你必須知道內部運作,即它是首先建立,然後完成或通告的。我想避免你必須知道內部運作。 – Tuur