Проблема с универсальной единицей измерения / соответствием - PullRequest
0 голосов
/ 20 ноября 2018

Я прочитал довольно много ресурсов о Единицах измерения (включая хороший Microsoft Doc и f # для развлечения и прибыли), но я все еще не могу заставить свой код работать.

[<Measure>] type USD
[<Measure>] type JPY
[<Measure>] type EUR

type FxUnit<[<Measure>] 'u,[<Measure>] 'v> = {UnitRate : float<'u/'v>}

let getFx1 u  =
    match u with
    | "USD" -> {UnitRate = 1.0<USD/USD>}
    | "EUR" -> {UnitRate = 1.0<USD/EUR>}

Таким образом, я получаюошибка под:

1.0<USD/EUR>

Я пробовал это:

let getFx1  u : (float<'u>) =
let getFx1  u : (float<'u/'v>) =

без особого успеха.Кажется, что при совпадении я не могу вернуть какой-то тип FxUnit с другим UoM.

Есть идеи, как я мог это исправить?

спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

Проблема в том, что вы пытаетесь определить функцию, которая принимает строку и возвращает значение типа FxUnit<USD,USD> или FxUnit<USD,EUR>.Функция не может иметь два разных типа возврата, определяемых во время выполнения.

Вы можете заставить FxUnit принимать два значения дискриминируемого объединения вместо мер:

type Currency =
    | USD
    | JPY
    | EUR

type FxUnit = { UnitRate : float; From : Currency; To : Currency }

let getFx1 u  =
    match u with
    | "USD" -> {UnitRate = 1.0; From = USD; To = USD}
    | "EUR" -> {UnitRate = 1.0; From = USD; To = EUR}
    | _     -> failwithf "Unrecognised units %s" u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...