Невозможно вернуть тип, который требует приведение (F #) - PullRequest
0 голосов
/ 31 мая 2018

Я не могу вернуть конкретный регистр типа другому типу, который просто хочет хранить универсальный регистр, и фактически не реализует конкретный пример.(Например, не относящиеся к типам ниже, вместо того, чтобы возвращать 0,1 с сантиметрами, я пытаюсь вернуть сантиметры).

Мой тип определяется следующим образом:

 type UnitOfMeasure =
    | Foo of decimal
    | Bar of decimal
    | Baz of decimal

У меня также есть:

 type BlahComponent =
    { Name : string
      Units : UnitOfMeasure }

Мне дано строковое представление типа UnitOfMeasure, и яя пытаюсь решить, какой UnitOfMeasure (Foo, Bar или Baz) у меня есть.Я использую следующую функцию:

let decideUnitOfMeasure stringRepresentationOfUnitOfMeasureType = 
    match stringRepresentationOfUnitOfMeasureType with 
      | "Foo" -> Foo
      | "Bar" -> Bar 
      | "Baz" -> Baz

Наконец, я пытаюсь присвоить возвращаемое значение manageUnitOfMeasure для BlahComponent

        let stringRepresentationOfUnitOfMeasureType = "Foo"
        let bomComponent = {Name = "nameString"
                            Units = decideUnitOfMeasure stringRepresentationOfUnitOfMeasureType}

Попытка присвоить возвращение figureUnitOfMeasure единицам приводит кследующая ошибка: ожидалось, что выражение будет иметь тип «UnitOfMeasure», но имеет тип «(десятичное число -> UnitOfMeasure)».

По определению UnitOfMeasure возвращается фактический случай Foo, Bar илиБаз невозможен, потому что он требует приведения UnitOfMeasure к десятичному числу.Есть ли способ вернуть фактический случай без приведения к десятичному числу?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Речь идет не о кастинге.Это просто ошибка типа.

Foo является конструктором для типа UnitOfMeasure.Он имеет тип decimal -> UnitOfMeasure.Это означает, что он принимает значение decimal и возвращает UnitOfMeasure.

Так что Foo сам по себе не является UnitOfMeasure, а Foo 1m.Ваше поле Units на самом деле также хранит номер, и вы не указали номер.

Это объясняет, почему вы видите эту ошибку.Ответ Чада Гилберта предлагает возможный альтернативный подход, но лучший подход действительно зависит от того, что вы пытаетесь сделать.

0 голосов
/ 31 мая 2018

Вам лучше всего переопределить UnitOfMeasure, чтобы действовать больше как простое перечисление, где конструкторы не имеют аргументов:

type UnitOfMeasure =
    | Foo
    | Bar
    | Baz

Теперь вы можете переместить десятичное значение, чтобы оно не былопараметр типа.Вы можете создать тип записи или даже сохранить его в виде простого кортежа:

type BlahComponent =
    { Name : string
      Value : UnitOfMeasure * decimal }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...