Как неявно преобразовать в общие супертипы в соответствии с шаблоном F #?

Сводка проблемы

В тот момент, когда я использую f #, я должен явно привести значение к родительскому типу его типа, чтобы получить выражения сопоставления с образцом для правильной проверки типа. В идеале я хотел бы сделать более аккуратный способ.

Пример

Предположим, у меня есть некоторая иерархия классов:

type Foo () =
    abstract member Value : unit -> string

type A (i:int) = 
    inherit Foo ()
        override this.Value () = i.ToString()

type B (s:string) = 
    inherit Foo ()
        override this.Value () = s

В идеале и в некоторых языках программирования обычно я бы написал эквивалент следующего:

let bar (i:int) : Foo =
    match i with
      | 1 -> B "one"
      | _ -> A i

Однако это не соответствует типу проверки, что дает мне ошибку " но мой реальный пример - создание экземпляров классов C #, где они являются обычными классами.

  • Есть ли у меня способ объявить функции для неявного преобразования типов, как, например, в scala, чтобы я мог применять автоматические преобразования для модуля, в котором я делаю это поколение?
  • Спасибо за любую помощь в этом вопросе.

    7
    задан Richard Warburton 11 October 2010 в 19:35
    поделиться