2009-11-29 8 views
0

Я получаю следующую ошибку в diff с красной меткой под подмножеством.
Type mismatch. Expecting a Range -> Choice but given a Range * Range -> ChoiceF # соответствует активному шаблону в виде расширенного кортежа

Есть ли какое-то типа аннотации я могу добавить к матчу подмножества, так что я не должен использовать 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 
    | _ ->() 

ответ

6

Вы можете сделать это:

| (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 
    | _ ->() 
+0

Отлично, спасибо! – gradbot

+1

Активный образец - такая простая концепция, но это действительно облегчает разбиение сложной проблемы на постепенно уменьшенные части и ее читаемость! – gradbot