Вы не можете использовать оператор ?
для доступа к функциям в модуле, потому что конструкция Checks?test1
не синтаксически верна (это будет переведено в (?) Checks "test"
, и вы не сможете использовать имена модулей в качестве значений).
Однако должна быть возможность сделать это для членов типа, использующих экземпляр объекта (например, obj?test
).В качестве альтернативы вы можете написать «поддельный» экземпляр объекта (который знает имя модуля).Реализация ?
будет затем искать модуль и искать статические члены в модуле.
Простейшая реализация (в первом случае) будет выглядеть следующим образом:
let (?) obj s =
let memb = obj.GetType().GetMethod(s)
// Return name and a function that runs the method
s, (fun args -> memb.Invoke(obj, args))
// Type that contains tests as members
type Check() =
member x.test1 () = 32
// We need to create instance in order to use '?'
let ch = Check()
let s,f = ch?test1
// Function 'f' takes array of objects as an argument and
// returns object, so the call is not as elegant as it could be
let n = ((f [| |]) :?> int)
YouМожно также добавить некоторые обертки, чтобы сделать функцию 'f' немного лучше, но я надеюсь, что это демонстрирует идею.К сожалению, это не может работать для модулей.