【发布时间】:2013-06-18 19:02:59
【问题描述】:
我正在编写一个程序,其中包含多个采用相同参数的函数。为简单起见,这是一个有些人为的示例:
buildPhotoFileName time word stamp = show word ++ "-" ++ show time ++ show stamp
buildAudioFileName time word = show word ++ "-" ++ show time ++ ".mp3"
buildDirectoryName time word = show word ++ "_" ++ show time
假设我正在循环访问来自 IO 的资源以在运行时获取 time 和 word 参数。在这个循环中,我需要加入上述函数的结果以进行进一步处理,所以我这样做:
let photo = buildPhotoFileName time word stamp
audio = buildAudioFileName time word
dir = buildDirectoryName time word
in ....
这似乎违反了“不要重复自己”的原则。如果以后我发现我想将word 更改为采用word 的函数,我可能会在let 表达式的开头创建一个新绑定,如下所示:
let wrd = processWord word
photo = buildPhotoFileName time wrd stamp
audio = buildAudioFileName time wrd
dir = buildDirectoryName time wrd
in ....
并且每次我将word 写入wrd 时都必须更改,如果我记得更改某些函数调用而不是其他函数调用,则会导致错误。
在 OOP 中,我会通过将上述函数放入一个类中来解决这个问题,该类的构造函数将 time 和 word 作为参数。实例化的对象本质上是三个函数,它们分别是 time 和 word。如果我想确保函数接收processWord word 而不是word 作为“参数”,我可以在构造函数中调用processWord。
有什么更好的方法可以更适合函数式编程和 Haskell?
【问题讨论】: