Универсальные функции для универсальных типов в F # - PullRequest
0 голосов
/ 29 января 2019

Я изучаю функциональное программирование с помощью 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 #?

1 Ответ

0 голосов
/ 29 января 2019

Простой способ объявить это inline:

let inline raiseToPower a power = 
    let folding x _ = x * a
    [1..power] |> List.fold folding (a / a) // <- handles power = 0

let result1 = raiseToPower 2 5
let result2 = raiseToPower 2. 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...