Я ищу идиоматический подход к программированию фильтров в F #. Для ясности я имею в виду фильтр как функцию, которая использует серию измерений с течением времени и производит изменяющиеся оценки. Это означает, что функция может поддерживать состояние. Например, в Python можно использовать сопрограммы для поддержания состояния очень чистым способом.Идиоматический подход к фильтрации
Что я ищу - это идиоматический подход к программированию фильтров в F #. Учитывая, что мой ум полностью загрязнен ООП и процедурные принципы, я, естественно, придумал классы, чтобы выразить их. Есть ли более идиоматический подход к фильтрации в F #, который может открыть другие преимущества функциональной парадигмы?
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