Я пишу программу с несколькими функциями, которые принимают те же аргументы. Вот несколько надуманный пример для простоты:
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?