Функция F # для использования в библиотеке c #: делегат с типом byref - PullRequest
3 голосов
/ 11 июня 2011

У меня есть библиотека ac # dll с одним методом g, принимающая следующую функцию f в C # в качестве входа

 void f(double[] x, ref double func, double[] grad, object obj)

В теле функции значения func и gradобновляются.Входная сигнатура g(f) в F # читает

f:float[]-> byref<float> -> float[]-> obj->unit

как мне написать f в f #, чтобы использовать g(f) в f #?

РЕДАКТИРОВАТЬ когда я слежу за ответом ildjarn ниже, как

let f(x:float[]) (func:byref<float>) (grad:float[]) (obj: obj) = 
    func <- ...
    grad.[0] <- ... 
    grad.[1] <- ...
    ...
    ()

Я получил ошибку g(f) с

Это значение функциииспользуется для создания типа делегата, чья сигнатура включает аргумент byref.Вы должны использовать явное лямбда-выражение, принимающее 4 аргумента.

что я должен сделать, чтобы это работало?Благодарю. ОБНОВЛЕНИЕ: Оказывается, я должен использовать g(fun (x:float[]) (func:byref<float>) (grad:float[]) (obj: obj) -> ....Невозможно дать внутренней функции имя типа f.

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Канонический способ представить функции F # другим языкам .NET - это использовать класс, иногда статический класс, например, дизайн библиотеки LChart ( ссылка ):

Финансовые функции Excel для .NET - это проект, написанный на F #, и общая библиотека .NET.Вы можете увидеть, как написан его публичный API.Вы также можете узнать, как связать файл FSharp.Core.dll с dll, чтобы на целевом компьютере не требовалось устанавливать среды выполнения F #.

Обновление:

ref double func переводится в f # как let y = ref (func), double[] grad это просто float[] в F #.См. Следующий пример для ref:

public class tt
{
    public static void temp(int x, ref double[] y)
    {
        y = new double[10];
        y[1] = 10;
    }
}

в F #:

    let y = ref (Array.create 10 0.0)
    tt.temp(0, y)
    printfn "%A" y
    0

Обратите внимание, что второй параметр temp имеет тип ref.Вы просто создаете дескриптор ref для объекта массива, используя оператор ref в F #.

1 голос
/ 11 июня 2011
let function1 (x:double[], func:byref<double>, grad:double[], obj:obj) = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...