【发布时间】:2013-08-29 07:53:30
【问题描述】:
我有两个由纯函数组成的函数。 第一个函数取一个地块,在上面盖房子,然后拍张照片在杂志上做广告:
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? -
它们形成一个实体,可用于程序的不同部分。当然它们可以被拆分,但随后这个实体就丢失了。在那种情况下,如果你想使用它们,你就必须知道它的内部运作,即它是先建造的,然后完成或宣传。我想避免你必须知道内部工作原理。
-
排除
build -
如果您不想将函数分解为单独的部分,这从您的 cmets 中可以明显看出,那么您可能应该对计算密集型函数使用一些记忆技术。
标签: .net f# functional-programming numerical-computing