Имена, связанные как с разложенными компонентами различимого объединения, так и с исходным составным значением

Я не могу найти документацию по этому вопросу. Мне нужно разбить значение "Дискриминационный союз" на некоторые его компоненты, но мне также нужно использовать элемент целиком в теле функции.

я могу сделать let matcher = function MyDU(_,b,_) -> b или же let extractor MyDU(_,b,_) = b но что, если мне также понадобится ссылка на значение MyDU для чего-то вроде ... -> RedundantWrapper(myDU, b)

Я пробовал:

let extractor myDU = 
    let MyDU(_,b,_) = myDU
    RedundantWrapper(myDU, b)

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

Спасибо!

2 ответа

Решение

Как это:

let (Some(x) as o) = Some 1

// val o : int option = Some 1
// val x : int = 1

Кроме того, я только что понял, что эта короткая комбинация разрешена, и я думаю, что все здесь согласятся, ДОВОЛЬНО УДИВИТЕЛЬНАЯ

let extractor (myDU & MyDU(_,b,_)) = 
    RedundantWrapper(myDU, b)
Другие вопросы по тегам