Из комментария к вопросу:
Я не хочу передавать их как параметры, как это было бы громоздким - в этом случае всем функциям потребуется один дополнительный параметр.И я не уверен, что это будет так же эффективно, как наличие нескольких глобальных функций (представляющих параметры).
Здесь есть некоторые неявные заблуждения, которые необходимо изучить.
Во-первых, известный: Если вы не уверены в эффективности, не надоОптимизируйте еще! Сначала напишите программу так, чтобы это было разумно, а затем профилируйте ее, если необходимо, для повышения скорости.Упреждающая оптимизация является хорошей идеей только тогда, когда вы знаете, что она уменьшит временную или пространственную сложность вашего алгоритма или если она значительно уменьшит постоянные факторы в очень трудоемкой части программы.В данном случае это не так.
Во-вторых, функции должны принимать столько параметров, сколько им нужно .Это звучит как тавтология, и это почти так, но дело в том, что нет смысла сокращать количество аргументов, передаваемых функции, которая фактически использует эти аргументы.Если он не фактически использует некоторые аргументы, удалите их;если группы аргументов используются вместе в подвыражениях, извлеките их как отдельные функции и передайте результат вместо;если куча аргументов передается вместе нескольким функциям, объедините их в тип записи и передайте это как один аргумент;но не пытайтесь устранить параметры ради их устранения.Это не имеет смысла!
Кроме того, из самого вопроса:
Однако мне нужно, чтобы эти параметры были чистыми, поэтому я не могу использовать IO.Следовательно, по крайней мере, часть моей программы приходится перекомпилировать каждый раз.
Чистые параметры - нет.Это постоянные значения.Вы можете определить их в другом месте исходного кода, но после компиляции они будут фиксированными и неизменными.Если программе требуется доступ к параметрам, которые do изменяются после компиляции, то имеет для использования ввода / вывода.Это практически определение ввода / вывода!
Имейте в виду, что даже если вам нужно получить значения в вычислении IO
, вся действительная логика может быть выполнена в чистой функциивот так:
main :: IO ()
main = do x <- getParameter
let r = lotsOfCalculations x
print r
Функция lotsOfCalculations
, как и все, что она использует, будет чистой функцией.Единственное использование IO
- получение параметров.
Кроме того, для краткости обратите внимание, что приведенный выше код также можно записать как main = getParameter >>= print . lotsOfCalculations
.