我检查了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
...
那么,它是否支持多个调度或支持有限?
答案 0 :(得分:3)
F#不支持您希望使用的多种调度方式。对于类上的方法,它确实支持重载解析,这与之类似。在您的示例中,List.map
和List.sum
是List
模块上的函数,由于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