F # Получить членов модуля - PullRequest
0 голосов
/ 13 апреля 2019

С учетом

type Unit = {
            Name : string
            Abbreviation : string
            Value : float
        }

module Lets =
    let meter = { Name = "meter"; Abbreviation = "m"; Value = 1.0 }
    let millimeter = { Name = "millimeter"; Abbreviation = "mm"; Value = 1e-3 }

Как я могу создать функцию с этой подписью?

let units () : Units[] = ...

1 Ответ

1 голос
/ 13 апреля 2019

F # Модули являются просто статическими классами при компиляции.

Используя отражение, вы сможете получить эти значения примерно так:

module Lets =
    type Dummy = | Dummy
    let meter = { Name = "meter"; Abbreviation = "m"; Value = 1.0 }
    let millimeter = { Name = "millimeter"; Abbreviation = "mm"; Value = 1e-3 }


let t = typeof<Lets.Dummy>.DeclaringType
t.GetProperties() |> Array.map(fun p -> p.GetValue(null, null) :?> Unit)

Сложно получить тип модуля, но этот трюк сделает это за вас.

EDIT:

Обновлено для приведения непосредственно к Unit. Приведение, как показано, небезопасно и будет выбрасываться, если GetValue не возвращает тип Unit.

Дополнительно unit - это тип в F #, может быть, будет понятнее использовать другое имя.

...