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