Sólo perder el tiempo con F # y yo estaba tratando de crear una función básica interpolación de Lagrange sobre la base de esta versión C# (copiado de una entrada de wiki C++):Reescritura de código C# en Fa #
double Lagrange(double[] pos, double[] val, double desiredPos)
{
double retVal = 0;
for (int i = 0; i < val.Length; ++i)
{
double weight = 1;
for (int j = 0; j < val.Length; ++j)
{
// The i-th term has to be skipped
if (j != i)
{
weight *= (desiredPos - pos[j])/(pos[i] - pos[j]);
}
}
retVal += weight * val[i];
}
return retVal;
}
Lo mejor que podía venir con el uso de mi conocimiento limitado de F # y la programación funcional fue:
let rec GetWeight desiredPos i j (pos : float[]) weight =
match i with
| i when j = pos.Length -> weight
| i when i = j -> GetWeight desiredPos i (j+1) pos weight
| i -> GetWeight desiredPos i (j+1) pos (weight * (desiredPos - pos.[j])/(pos.[i] - pos.[j]))
let rec Lagrange (pos : float[]) (vals : float[]) desiredPos result counter =
match counter with
| counter when counter = pos.Length -> result
| counter -> Lagrange pos vals desiredPos (result + (GetWeight desiredPos counter 0 pos 1.0)* vals.[counter]) (counter+1)
Puede alguien proporcionar una mejor versión más ordenado #/F basado en el mismo código C# ?
Creo que este es un buen ejemplo de cuándo el código imperativo es más fácil de leer y mantener que funcional. – gradbot