Полагаю, вы не хотите включать отражение, не так ли?
Тогда, я полагаю, единственным вариантом будет использование сопоставления с образцом.(Довольно ограниченное) бремя будет определять 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)