Как я могу преобразовать F# (double -> double) в Func<double, double>?

Я использую MathNet.Numerics.LinearAlgebra построить библиотеку. Мне нужно применить пользовательскую функцию к каждому элементу матрицы, для которой я знаю, что могу использовать Map:

open System
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.LinearAlgebra.Double

let m1 = matrix [[1.0; 2.0; 3.0]]
let f1 = fun s -> s * 3.14
let m2 = m1.Map f1 // THIS FAILS
let m3 = m1.Map (fun s -> s * 3.14) // THIS WORKS!

В строке для m2 Я получаю следующую ошибку:

This expression was expected to have type Func<float, 'a> but here has type double -> double

Но мне нужно иметь возможность передавать в функцию отображения вместо определения ее в строке, как для m3, Документация для MathNet.Numerics похоже, нет ответа на мою проблему.

Заранее спасибо за помощь.

2 ответа

Решение

Вы можете построить делегат так:

let m2 = m1.Map (Func<_, _> f1)

F# неявно создает делегаты в некоторых случаях, как видно из лямбды в вопросе, но это не всегда без проблем. См. Страницу MSDN для делегатов в F# для некоторой дополнительной информации.

Расширения F# (пакет MathNet.Numerics.FSharp) обычно предоставляют вариант, который может обрабатывать обычные функции F#. В этом случае вы можете написать:

let m2 = m1 |> Matrix.map f1
Другие вопросы по тегам