F#是否支持多种调度/多种方法?

时间:2019-04-04 15:41:34

标签: f#

我检查了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 个答案:

答案 0 :(得分:3)

F#不支持您希望使用的多种调度方式。对于类上的方法,它确实支持重载解析,这与之类似。在您的示例中,List.mapList.sumList模块上的函数,由于F#函数无法重载,因此不符合重载解析的条件。

答案 1 :(得分:2)

F#确实支持方法的重载解析,对于函数来说,它有点复杂,因为没有直接的支持,但是您可以通过创建调用重载方法的内联函数来实现,这会导致特征调用。

您可以了解其工作原理here

FSharpPlus library中提供了一个很好的示例,使用它您可以直接编写代码:

在您的示例中:

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