Проверка, является ли функция F #, возвращаемая вашим getStrategy
, той же функцией, что и одна из определенных вами функций, также практически невозможна.
Чтобы дать некоторые подробности - компилятор F # генерирует класс, который наследуется от FSharpFunc
, когда вы возвращаете функцию в качестве значения.Что еще более важно, он генерирует новый класс каждый раз, когда вы создаете значение функции, поэтому вы не можете сравнивать типы классов.
Структура сгенерированных классов выглядит примерно так:
class getStrategy@7 : FSharpFunc<IEnumerable<double>, IEnumerable<double>> {
public override IEnumerable<double> Invoke(IEnumerable<double> points) {
// Calls the function that you're returning from 'getStrategy'
return Test.equalStrategy(points);
}
}
// Later - in the body of 'getStrategy':
return new getStrategy@7(); // Returns a new instance of the single-purpose class
В принципе, вы можете использовать Reflection, чтобы заглянуть внутрь метода Invoke
и найти, какая функция вызывается оттуда, но это не будет надежным решением.
На практике - я думаю, вам, вероятно, следует использовать какой-то другой более простой тест, чтобы проверить, вернула ли функция getStrategy
правильный алгоритм.Если вы запускаете возвращенную стратегию на нескольких примерах входных данных, этого должно быть достаточно для проверки правильности возвращаемого алгоритма, и вы не будете полагаться на детали реализации (например, возвращает ли функция getStrategy
только именованныйфункция или возвращает ли она новую лямбда-функцию с таким же поведением.
В качестве альтернативы, вы можете обернуть функции в Func<_, _>
делегаты и использовать тот же подход, который будет работать в C #. Однако я думаю, что проверка, getStrategy
возвращает конкретную ссылку - слишком подробный тест, ограничивающий вашу реализацию.