Заменить стоимость одного предмета единого случая дискриминируемого объединения? - PullRequest
0 голосов
/ 20 сентября 2018

Видите, у меня есть единый случай дискриминации

type R = R of string * int * sting option * .....

И я получил значение R.

let r: R = getAValue ()

Теперь мне нужно заменить первый элемент r в пустую строку и сохраните все остальные значения.Как это сделать?Тип записи имеет конструкцию with

let r' = { r with Item1 = "" }

Я знаю, что он может использовать «сопоставление с шаблоном», чтобы извлечь все элементы и создать новый.Но это кажется очень громоздким.

1 Ответ

0 голосов
/ 21 сентября 2018

Полагаю, вы не хотите включать отражение, не так ли?

Тогда, я полагаю, единственным вариантом будет использование сопоставления с образцом.(Довольно ограниченное) бремя будет определять r-ity вашего типа R в качестве шаблона для сопоставления.

Предположим, например, что ваш R оборачивает кортеж из 3 элементов, то есть имеет r-ity 3:

type R = R of string * int * string option

В этом случае все, что вам нужно, это определить следующую функцию:

let modR = function
| R(x,y,z) -> R("",y,z)

Подпись modR - R -> R, быстрая проверкавашего сценария:

let r = R("abc",1,None)
modR r

в fsi возвращает

> 
val it : R = R ("",1,None)

Все, что вам понадобится для применения вышеприведенного к вашему конкретному R, - это фактическая истинность вашего типав шаблон.

ОБНОВЛЕНИЕ: Как указал Федор Сойкин , функция соответствия вообще не требуется для развертывания одного случаяDU (см. документы ).Требуемое определение функции преобразования может быть определено просто:

let modR (R(_,y,z)) = R("",y,z)

ОБНОВЛЕНИЕ2: При рассмотрении комментария от ca9163d9 я вспомнил еще одинаромат сопоставления с образцом, а именно как Pattern .Использование его при реализации искомого преобразования в виде члена DU дает:

type R = R of string * int * string option with
    member self.modR() = let R(_,b,c) as x = self in R("",b,c)

Также @FyodorSoikin и @kaefer указали в комментариях, что форма as x не требуется для простого развертывания DU, аналогично приведенному выше определению функции terser modR:

    member self.modR() = let (R(_,b,c)) = self in R("",b,c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...