2017-03-09 11 views
1

merge 함수가 해당 형식에 대해 불만을 표시하는 이유는 무엇입니까?2 지연 목록 형식 충돌을 병합

x이 (가) type 'a seq이 아닌가요?

type 'a seq = Stop | Cons of 'a * (unit -> 'a seq) 

let rec linear start step= (*builds a seq starting with 'start'*) 
    Cons (start, fun() -> linear (start+step) step) 

let rec take n seq = match seq with (*take first n elem from seq*) 
| Stop -> [] 
| Cons (a, f) -> if n < 1 then [] else a::(take (n-1) (f())) 

let rec merge seq1 seq2 = match seq1, seq2 with 
    | Stop, _ -> seq2 
    | _, Stop -> seq1 
    | Cons(h1, tf1), _ as x -> 
     Cons(h1, fun() -> merge (x) (tf1())) 

let l1 = linear 1 1 
let l2 = linear 100 100 
let l3 = interleave l1 l2 

제가

take 10 l3 

INT리스트에 맞는 결과를보고 싶다 = 1; 100; 2; 200; 삼; 300; 4; 400; 5; (500)]

merge이 작동하지 않는 이유

let rec merge seq1 seq2 = match seq1 with 
| Stop -> Stop 
| Cons (h, tf) -> Cons(h, fun() -> merge seq2 (tf())) 

하지만 난 그것을 얻을하지 않는 것 (작동) 내 함수를 작성하는 또 다른 방법.

감사합니다.

답변

0

여기서는 as x이 전체 패턴을 포착하기 때문에 (_ as x)으로 작성하십시오.

그래서, 당신은 무엇을 참조하십시오

| Cons(h1, tf1), (_ as x) -> ... 

실제로

| (Cons(h1, tf1), _) as x -> ... 

으로 분석됩니다 그리고 당신이 실제로 쓸 수 :

| Cons(h1, tf1), x -> ... 

훨씬 더 ;-)

어느

심지어

| Cons(h1, tf1), _ -> Cons(h1, fun() -> merge seq2 (tf1()))