Вызов функции из ее имени в виде строки в f # - PullRequest
5 голосов
/ 04 июня 2011

Я думал, что смогу сделать это с цитатами - но я не понимаю, как.

Должен ли я просто использовать таблицу функций с их именами или это способ сделать это?

Спасибо.

Для получения дополнительной информации ......

Я вызываю множество функций f # из Excel, и мне стало интересно, смогу ли я написать функцию f #

let fs_wrapper (f_name: string) (f_params: list double) = этот бит вызывает fname с помощью f_params

и затем используйте

= fs_wrapper ("my_func", 3.14, 2.71)

в листе, а не оборачивать все функции отдельно.

Ответы [ 3 ]

10 голосов
/ 04 июня 2011

Для этого вам нужно будет использовать стандартное отражение .NET.Цитаты не помогут, потому что они представляют вызовы функций с использованием стандарта .NET MethodInfo, поэтому вам все равно придется использовать отражение.Единственное преимущество цитат (по сравнению с наивным размышлением) состоит в том, что вы можете скомпилировать их, что может повысить производительность (но компиляция не идеальна).

В зависимости от вашего конкретного сценария (например, где находятсяфункции), вам нужно сделать что-то вроде:

module Functions =
  let sin x = sin(x)
  let sqrt y = sqrt(y)

open System.Reflection

let moduleInfo = 
  Assembly.GetExecutingAssembly().GetTypes()
  |> Seq.find (fun t -> t.Name = "Functions")

let name = "sin"
moduleInfo.GetMethod(name).Invoke(null, [| box 3.1415 |])

Если вам не нужна некоторая расширяемость или большое количество функций, используйте словарь, содержащий строку в качестве ключа и значение функции, поскольку значение можетбыть более простым вариантом:

let funcs = 
  dict [ "sin", Functions.sin;
         "sqrt", Functions.sqrt ]

funcs.[name](3.1415)
2 голосов
/ 04 июня 2011

Существует много методов, но одним из способов является использование Reflection, например:

typeof<int>.GetMethod("ToString", System.Type.EmptyTypes).Invoke(1, null)
typeof<int>.GetMethod("Parse", [|typeof<string>|]).Invoke(null, [|"112"|])

GetMethod может принимать массив типов, определяющих сигнатуру, но вы можете пропустить это, если ваш метод однозначен.

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

В продолжение того, на что намекал Томас, взгляните на Использование и злоупотребление оператором динамического поиска F # Мэтью Подвизоки. Он предлагает синтаксически чистый способ выполнения динамического поиска в F #.

...