Для этого вам нужно будет использовать стандартное отражение .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)