Поддерживает ли F # множественные методы отправки / множественные методы? - PullRequest
1 голос
/ 04 апреля 2019

Я проверил пример F #, и похоже, что

// define the square function
let square x = x * x

// define the sumOfSquares function
let sumOfSquares n = 
   [1..n] |> List.map square |> List.sum

// try it
sumOfSquares 100

При таком использовании кажется, что F # не поддерживает множественную диспетчеризацию, в противном случае он будет записан как

...
let sumOfSquares n = 
   [1..n] |> map square |> sum
...

Итак, поддерживает ли он многократную отправку или имеет ограниченную поддержку?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

F # не поддерживает множественную рассылку так, как вы хотели бы ее использовать.Для методов классов поддерживается разрешение перегрузки, что аналогично.В вашем примере List.map и List.sum являются функциями модуля List и, следовательно, не имеют права на разрешение перегрузки, поскольку функции F # не могут быть перегружены.

2 голосов
/ 05 апреля 2019

F # поддерживает разрешение перегрузки методов, для функций это немного сложнее, поскольку прямой поддержки нет, но вы можете добиться этого, создав встроенные функции, которые вызывают перегруженные методы, что приведет к вызову trait.

Вы можете узнать, как это работает здесь .

И хороший пример этого можно найти в библиотеке FSharpPlus , с ее помощью вы можете написать свой код, как он есть:

В вашем примере:

open FSharpPlus

// define the square function
let square x = x * x

// define the sumOfSquares function
let sumOfSquares n = 
   [1..n] |> map square |> sum

// try it
sumOfSquares 100

// also with arrays !
let sumOfSquares2 n = 
   [|1..n|] |> map square |> sum

sumOfSquares2 100

А что если вы хотите суммировать числа? Он не будет работать, если вы не включите функцию square:

// define the square function
let inline square x = x * x

// with floats
let sumOfSquares3 n = 
   [1.0 .. n] |> map square |> sum

// try it
sumOfSquares3 100.0

// val it : float = 338350.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...