Я пишу программу с несколькими функциями, которые принимают те же аргументы. Вот несколько надуманный пример для простоты:
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
, приводя к ошибкам, если не помню, чтобы сменить некоторые вызовы функций, но не другие.
В ООП я решил бы это, поставив вышеуказанные функции в класс, конструктор которого примет в качестве аргументов time
и word
. Эквивалентным объектом будет, по существу, три функции, рассчитанные на time
и word
. Если бы я хотел убедиться, что функции получают processWord word
вместо word
как "аргумент", я мог бы вызвать processWord
в конструкторе.
Каков наилучший способ сделать это, который больше подходит для функционального программирования и Haskell?