FSharpChoice в C # - PullRequest
       8

FSharpChoice в C #

6 голосов
/ 23 февраля 2011

Я пытаюсь использовать тип FSharpChoice в проекте C #. Я создал такой выбор

var a = FSharpChoice<T1,T2,T3>.NewChoice1Of3(instofT1);

Теперь, как мне получить instofT1 из типа выбора.

Я вижу, что могу сделать IsChoice1Of3, но как мне получить значение в объекте выбора?

Ответы [ 3 ]

6 голосов
/ 24 февраля 2011

Я бы, вероятно, не использовал бы тип непосредственно из C # - вы можете сделать это, но полученный код не будет очень хорошим.Вероятно, я бы объявил свой собственный тип Choice, который будет выглядеть следующим образом:

type Choice<'T1, 'T2> private (opt1, opt2) =
  member x.TryGetChoice1Of2(arg:byref<'T1>) = //'
    match opt1 with
    | Some v -> arg <- v; true
    | _ -> false
  // Similar code for 'TryGetChoice2Of2'

type Choice = // static methods for creating (Choice1Of2, ...)

При этом используются параметры byref, которые отображаются в виде out параметров в C #, поэтому вы можете написать:

int num;
string str;
if (choice.TryGetChoice1Of2(out num)) // ...
else if (choice.TryGetChoice2Of2(out str)) // ...
else // assert(false)

Это определенно более приятный способ работы с типом из C # (и он использует шаблон, знакомый, например, по работе с Int32.TryParse).

5 голосов
/ 23 февраля 2011

Приведите значение к FSharpChoice<T1,T2,T3>.Choice1Of3 и используйте свойство Item.

См. Скомпилированная форма типов объединений для использования на других языках CLI в спецификации F # для получения дополнительной информации о том, как представлены дискриминационные объединения.

3 голосов
/ 26 июля 2011

Недавно я запустил проект , чтобы создать «слой совместимости», чтобы FSharp.Core можно было легче использовать из C #. В частности, он позволяет использовать универсальные распознаваемые объединения из C #, например:

var choice = Choice.New1Of3<int,string,string>(100);
int r = choice.Match(i => i + 21, s => s.Length + 1, s => s.Length + 5);

Это делает сопоставление с образцом в распознаваемом объединении, аналогично тому, как вы делали бы это в F #, за исключением имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...