У меня есть опыт разработки программного обеспечения, и сейчас я изучаю Haskell. Во многих разработок программного обеспечения реального мира, один сталкивается с ситуацией, как один данный, например, ниже:Как реорганизовать эту цепочку функций Haskell?
Предположим, у меня есть этот код
f1 a b c d = e
where
e1 = f2 b c (f3 a)
e2 = f4 d
e = e1 + e2
f2 b c d = n + c + d
where
n = f5 b
f5 n = n*n
f3 a = a * 2
f4 a = a + 3
Теперь, если я хочу изменить f5 так, что он принимает еще другой параметр, мне придется изменить всю цепочку функций прямо до f1. Это можно сделать, как показано ниже. Обратите внимание на добавленный параметр x.
f1 a b c d x = e -- f1 needs to be changed
where
e1 = f2 b c (f3 a) x
e2 = f4 d
e = e1 + e2
f2 b c d x = n + c + d -- f2 needs to be changed
where
n = f5 b x
f5 n x = n*n -- f5 changed (**bang**)
f3 a = a * 2
f4 a = a + 3
Это нормальный Haskell способ делать такого рода вещи, или есть лучше (Haskell-МОГ) способ? Я знаю, что такое изменение в API будет нарушать клиентский код, но как влияние может быть минимальным и есть ли какой-либо способ Hasekll для этого?
На более общем уровне: насколько хорошо Haskell выполняет в таких случаях (особенно принимая во внимание его неизменяемое состояние)? Что предложить разработчикам в этом отношении? Или это то, что Haskell не играет никакой роли, по сути, играть в этом и что это просто сложная проблема разработки программного обеспечения (нет такой вещи, как будущего доказательства), что нам нужно идти в ногу с этим?
Приносим извинения за то, что вы задали несколько вопросов в одном сообщении, но я не могу помочь, поскольку они связаны друг с другом. Кроме того, я не мог найти аналогичный вопрос, извините, если бы я, возможно, пропустил его.
Ну, вы всегда можете изменить подпись типа и список аргументов (вы пишете сигнатуры типов, не так ли?), А затем смотрите, где компилятор жалуется. Исправьте первое место, затем вернитесь к шагу 2 до тех пор, пока не будут исчерпаны все ошибки. Если у вас есть общий набор аргументов, которые передаются многим функциям, вероятно, было бы лучше сделать новый тип данных для хранения всех этих значений, тогда вы можете избежать изменения аргументов функции и вместо этого просто изменить определение этого типа. Это проблема программного обеспечения, а не Haskell. – bheklilr