F# 函数在不传递参数的情况下工作

F# 函数在不传递参数的情况下工作,f#,f#-interactive,F#,F# Interactive,/!\F#品牌新手/\ 我有这个密码 #r @"..\packages\Accord.3.4.0\lib\net40\Accord.dll" #r @"..\packages\Accord.Statistics.3.4.0\lib\net40\Accord.Statistics.dll" #r @"..\packages\Accord.Math.3.4.0\lib\net40\Accord.Math.dll" open Accord open Accord.Statistics.Models.

/!\F#品牌新手/\

我有这个密码

#r @"..\packages\Accord.3.4.0\lib\net40\Accord.dll"
#r @"..\packages\Accord.Statistics.3.4.0\lib\net40\Accord.Statistics.dll"
#r @"..\packages\Accord.Math.3.4.0\lib\net40\Accord.Math.dll"

open Accord
open Accord.Statistics.Models.Regression.Linear

let input = [|1,1.;2,2.;3,2.25;4,4.75;5,5.|]

let x = input |> Array.map(fun (x,y) -> float x)
let y = input |> Array.map(fun (x,y) -> y) 
let regression = SimpleLinearRegression()

let sse = regression.Regress(x,y)
let intercept = regression.Intercept
let slope = regression.Slope
let mse = sse/float x.Length
let rmse = sqrt mse
let r2 = regression.CoefficientOfDetermination(x,y)
这给了我结果

val input : (int * float) [] = [|(1, 1.0); (2, 2.0); (3, 2.25); (4, 4.75); (5, 5.0)|]
val x : float [] = [|1.0; 2.0; 3.0; 4.0; 5.0|]
val y : float [] = [|1.0; 2.0; 2.25; 4.75; 5.0|]
val regression : SimpleLinearRegression = y(x) = 1,075x + -0,224999999999998
val sse : float = 1.06875
val intercept : float = -0.225
val slope : float = 1.075
val mse : float = 0.21375
val rmse : float = 0.4623310502
val r2 : float = 0.9153465347

SimpleLinearRegression
函数如何工作,但我们甚至不传递它
x
y


你能给我指一个参考资料来了解这背后的F#魔力吗?

我猜你正在使用F-Sharp Interactive,并将所有代码一次性发送给FSI

神奇的是先执行代码,然后编写结果。即使“val”输出的顺序有点违反直觉

我可以用这个例子来说明(给未来的读者):


请注意,
a
在打印之前是如何更新到其最终值的(我们甚至从未看到1和2,尽管它们分别是
a
在第一行和第二行之后的值)。

SimpleLinearRegression
不是一个函数,而是一个类构造函数。首先构造该类的一个对象,给它一个名称
regression
,然后对其调用方法
regresse
-
regression.regresse(x,y)
-这就是传递参数的地方。
let mutable a = 1
let f = a <- 2; fun () -> 3
do a <- f ()
val mutable a : int = 3
val f : (unit -> int)
val it : unit = ()