gpt4 book ai didi

Haskell:如何组织一组都采用相同参数的函数

转载 作者:行者123 更新时间:2023-12-04 02:42:09 25 4
gpt4 key购买 nike

我正在编写一个程序,其中包含几个采用相同参数的函数。为简单起见,这是一个有些人为的示例:

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 的资源以获取 timeword运行时的参数。在这个循环中,我需要加入上述函数的结果以进行进一步处理,所以我这样做:
let photo = buildPhotoFileName time word stamp
audio = buildAudioFileName time word
dir = buildDirectoryName time word
in ....

这似乎违反了“不要重复自己”的原则。如果在路上我发现我想改变 word到函数采用 word , 我可能会在 let 的开头做一个新的绑定(bind)像这样的表达:
let wrd   = processWord word
photo = buildPhotoFileName time wrd stamp
audio = buildAudioFileName time wrd
dir = buildDirectoryName time wrd
in ....

并且每次我写 word 时都必须更改至 wrd ,如果我记得更改某些函数调用而不是其他函数调用,则会导致错误。

在 OOP 中,我会通过将上述函数放入一个类中来解决这个问题,该类的构造函数将采用 timeword作为论据。实例化的对象本质上是三个函数库化到 timeword .如果我想确保函数接收 processWord word而不是 word作为“论据”,我可以调用 processWord在构造函数中。

有什么更好的方法可以更适合函数式编程和 Haskell?

最佳答案

既然您说您已准备好为此创建一个 OO 包装类,我假设您愿意更改您的功能。以下是一个生成您想要的所有三个结果的元组的函数:

buildFileNames time word stamp = 
( show word ++ "-" ++ show time ++ show stamp,
show word ++ "-" ++ show time ++ ".mp3",
show word ++ "_" ++ show time )

您将能够像这样使用它:
let wrd   = processWord word
(photo, audio, dir) = buildFileNames time wrd stamp
in ....

如果你不需要任何结果,你可以像这样跳过它们:
let wrd   = processWord word
(_, audio, _) = buildFileNames time wrd stamp
in ....

值得注意的是,您不必担心 Haskell 将资源浪费在计算您不使用的值上,因为它是惰性的。

关于Haskell:如何组织一组都采用相同参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com