Ограничение универсальной функции F # типом объединения?

Согласно заголовку, есть ли способ ограничить общую функцию F # типом объединения? Пока я использую:

let toDomain<'T> external: 'T option =
    assert FSharpType.IsUnion(typeof<'T>)
    ...

Который терпит неудачу во время выполнения с System.ArgumentException, если я пытаюсь использовать не-объединение, но я бы предпочел проверку раньше.


person Dutts    schedule 16.02.2015    source источник
comment
Вы задали здесь пару вопросов, которые, похоже, выходят за рамки системы типов F#. Рассматривали ли вы более идиоматический подход? Что вы действительно пытаетесь сделать?   -  person Mark Seemann    schedule 16.02.2015
comment
@MarkSeemann — у нас есть много связывающего кода между нашей установленной кодовой базой C# и более новым F#. Наш фактический F# работает, но на данный момент сопоставление типов C# включает в себя много повторяющегося кода, который влияет на нашу масштабируемость, поэтому я хотел написать что-то более универсальное.   -  person Dutts    schedule 17.02.2015
comment
В вашем другом вопросе вы пишете, что хотите иметь возможность писать let testThings = toDomain<MyModule.MappedThings> doExternalThings. Чем это лучше, чем let testThings = MyModule.MappedThings doExternalThings? Собственный синтаксис F# короче вызова функции, который вам нужен, и безопасен для типов...   -  person Mark Seemann    schedule 17.02.2015
comment
Я вижу вашу точку зрения. Мой реальный пример немного сложнее, когда я хочу выполнить сопоставление, у меня есть obj, и поэтому мне нужно подумать над моим объединением 'T, чтобы увидеть, какой случай принимает этот тип obj. Это привело к большому количеству повторяющегося кода сопоставления повсюду.   -  person Dutts    schedule 17.02.2015


Ответы (1)


No.

Если вы посмотрите на реализация из IsUnion и немного следуйте коду, он сводится к проверке наличия атрибута/аргумента [<CompilationMapping(SourceConstructFlags.SumType)>].

На данный момент нет поддержки чисто основанных на атрибутах ограничений ни в F#, ни в .NET.

person latkin    schedule 16.02.2015