F # соответствует активному шаблону как расширенный кортеж

StackOverflow https://stackoverflow.com/questions/1816918

Вопрос

Я получаю следующую ошибку в 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
    | _ -> ()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top