我正在编写一个程序,其中包含几个采用相同参数的函数。为简单起见,这是一个有些人为的示例:
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
andword
参数。在这个循环中,我需要加入上述函数的结果以进行进一步处理,所以我这样做:
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
作为参数。实例化的对象本质上是 curried 到time
和的三个函数word
。如果我想确保函数接收processWord word
而不是word
作为“参数”,我可以调用processWord
构造函数。
有什么更好的方法可以更适合函数式编程和 Haskell?