F # içinde programlama filtrelerine deyimsel bir yaklaşım arıyorum. Açıklık sağlamak için, zaman içinde bir dizi ölçüm kullanan ve gelişen tahminler üreten bir işlev olarak bir filtreye başvuruyorum. Bu, fonksiyonun durumu koruyabileceğini ima eder. Örneğin, Python'da, durumu çok temiz bir şekilde tutmak için koroutinler kullanılabilir.Filtrelemeye yönelik deyimsel yaklaşım
Aradığım şey, F # içindeki programlama filtrelerine deyimsel bir yaklaşım. Aklımın OOP ve prosedür ilkeleri ile tamamen kirlendiği göz önüne alındığında, doğal olarak onları ifade etmek için derslerle geldim. F # içinde filtreleme yapmak için daha işlevsel bir yaklaşım var mı, belki de işlevsel paradigmanın diğer faydalarını açabilir mi? iletmenin veri ve kod veri ayırma: Senin durumunda
open System
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.Random
open MathNet.Numerics.Distributions
open MathNet.Numerics.Statistics
open FSharp.Charting
type ScalarKalman (A : float, H : float, Q : float, R : float) = class
let mutable A = A
let mutable H = H
let mutable Q = Q
let mutable R = R
let mutable p = 0.
let mutable x = 0.
let mutable k = 0.
let mutable result = 0.
member this.X
with get() = x
and set(value) = x <- value
member this.P
with get() = p
and set(value) = p <- value
member this.K
with get() = k
and set(value) = k <- value
member this.update(newVal : float) =
let xp = A * this.X
let Pp = A * this.P * A + Q
this.K <- Pp * H/(H * Pp * H + R)
this.X <- xp + this.K * (newVal - H * xp)
this.P <- Pp - this.K * H * Pp
end
let n = 100
let obsv = [|for i in 0 .. n do yield 0.|]
let smv = [|for i in 0 .. n do yield 0.|]
let kal = new ScalarKalman(1., 1., 0., 5.)
kal.P <- 4.
kal.X <- 6.
for i in 0 .. n do
obsv.[i] <- Normal.Sample(10., 5.)
kal.update(obsv.[i])
smv.[i] <- kal.X
Chart.Combine([obsv |> Chart.FastLine
smv |> Chart.FastLine]) |> Chart.Show