Я изучаю функциональное программирование с помощью F #, и я хочу написать функцию для увеличения числа до степени.Я написал это следующим образом:
let raiseToPower a power =
let folding x _ = x * a
[1..power-1] |> List.fold folding a
let result = raiseToPower 2 5
Я не указал тип входной переменной a
, поэтому я могу использовать эту функцию с числом с плавающей запятой или целым числом - но не с обоими
let result = raiseToPower 2.3 5 // OK
// separate program
let result = raiseToPower 2 5 // OK
// separate program
let result1 = raiseToPower 2.3 5 // OK
let result2 = raiseToPower 2 5 // fail
Первый вопрос: Есть ли способсделать его универсальным?
Причина, по которой я создал функцию для чего-то, что в F # уже имеет встроенную реализацию, заключается в том, что я хочу использовать нечто подобное с пользовательским типом - например, комплексными числами.
Рассмотрим следующее:
type ComplexNumber = {re: double; im: double;}
let (@*) cn1 cn2 =
{re = cn1.re * cn2.re - cn1.im * cn2.im; im = cn1.re * cn2.im + cn1.im * cn2.re}
У меня есть новый тип ComplexNumber
и новый оператор для него, который умножает два комплексных числа.Теперь я могу написать аналогичную функцию для повышения ComplexNumber
до мощности:
let raiseCnToPower a power =
let folding x _ = x @* a
[1..power-1] |> List.fold folding a
Итак, второй вопрос: Есть ли способ заставить начальную функцию работатьс пользовательскими типами и пользовательскими операторами?
Заключительный вопрос: Я хотел бы знать, что вам следует делать здесь с точки зрения функционального программирования.Считается ли это проблемой, или разные функции для разных типов, выполняющие почти одинаково, в порядке?Есть ли способ улучшить решение с точки зрения функционального программирования и, в частности, F #?