2009-11-29 2 views
0

하위 세트에서 빨간색 squiggle이있는 diff에서 다음 오류가 발생합니다.
Type mismatch. Expecting a Range -> Choice but given a Range * Range -> ChoiceF #이 확장 된 튜플로 활성 패턴과 일치합니다.

내가 fst와 snd를 사용할 필요가 없도록 일종의 특수 효과 주석을 추가 할 수 있습니까? 그렇지 않다면이 구문을 지원할 의사가 있습니까?

| (x,y) & SubSet -> if xe.MoveNext() then useOldx x xe ye 

또는 당신이 할 수 있습니다 : :

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

이 작업을 수행 할 수

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

관련 문제