2017-03-09 7 views
1

私の関数がその型について不平を言うのはなぜですか?2つの遅延リストタイプの競合をマージする

私のxtype '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; 3; 300; 4; 400; 5; (作品)500]私の関数を記述するために

もう一つの方法は、

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

だろうが、最初のmergeが動作しない理由を私は、それを得ることはありません。

ありがとうございました。

答えて

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())) 
関連する問題