F # соответствует активному шаблону как расширенный кортеж
-
08-07-2019 - |
Вопрос
Я получаю следующую ошибку в diff с красным вихрем под Subset.
Несоответствие типов. Ожидая диапазон - > Выбор, но с учетом диапазона * Range - > Выбор код>
Есть ли какая-то аннотация типа, которую я могу добавить к совпадению с SubSet, чтобы мне не приходилось использовать fst и snd? Если нет, есть ли намерение поддержать этот синтаксис?
type Range = {min : int64; max : int64}
let (|Before|After|BeforeOverlap|AfterOverlap|SuperSet|SubSet|) (x, y) =
if x.min > y.max then After
elif x.min >= y.min then
if x.max <= y.max then SubSet
else AfterOverlap
elif x.max < y.min then Before
elif x.max <= y.max then BeforeOverlap
else SuperSet
let useOldx x xe ye = ()
let diff (xe:IEnumerator<Range>) (ye:IEnumerator<Range>) =
match xe.Current, ye.Current with
| After as tuple -> ()
| Before as t -> if xe.MoveNext() then useOldx (fst t) xe ye
| SuperSet as t ->
let x, y = t
if xe.MoveNext() then useOldx x xe ye
| SubSet as x, y -> if xe.MoveNext() then useOldx x xe ye
| _ -> ()
Решение
Вы можете сделать это:
| (x,y) & SubSet -> if xe.MoveNext() then useOldx x xe ye
или вы могли бы сделать это:
open System.Collections.Generic
type Range = {min : int64; max : int64}
let (|Before|After|BeforeOverlap|AfterOverlap|SuperSet|SubSet|) (x, y) =
if x.min > y.max then After
elif x.min >= y.min then
if x.max <= y.max then SubSet(x,y)
else AfterOverlap
elif x.max < y.min then Before
elif x.max <= y.max then BeforeOverlap
else SuperSet
let useOldx x xe ye = ()
let diff (xe:IEnumerator<Range>) (ye:IEnumerator<Range>) =
match xe.Current, ye.Current with
| After as tuple -> ()
| Before as t -> if xe.MoveNext() then useOldx (fst t) xe ye
| SuperSet as t ->
let x, y = t
if xe.MoveNext() then useOldx x xe ye
| SubSet(x, y) -> if xe.MoveNext() then useOldx x xe ye
| _ -> ()
Не связан с StackOverflow