2016-11-20 69 views
2

我已經創建了一個函數,我想匹配列表的長度從給定的索引到列表的末尾。例。 list。[4 ..]會給你一個新的列表,從索引4到結尾的列表中的元素。我知道這是事實,因爲我已經做了很多次。F#:list。[(argument)..]錯誤匹配模式

但現在,當我嘗試做一個匹配模式則錯誤:

「的基礎上在此之前程序點信息不確定類型的對象查找的類型註釋可在此之前的程序所需。指向約束對象的類型,這可能允許查找被解決。「

我的代碼看起來是這樣的:

let rec possibilityGuess n p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 SS = 
    match (List.length (SS.[n..])) with 
    |1 -> match (validate (List.item(0) SS) (List.item(n) SS)) with 
     |(0,0) -> [(p1+1);p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;p12;p13;p14] 
     |(0,1) -> [p1;(p2+1);p3;p4;p5;p6;p7;p8;p9;p10;p11;p12;p13;p14] 
     |(0,2) -> [p1;p2;(p3+1);p4;p5;p6;p7;p8;p9;p10;p11;p12;p13;p14] 
     |(0,3) -> [p1;p2;p3;(p4+1);p5;p6;p7;p8;p9;p10;p11;p12;p13;p14] 
     |(0,4) -> [p1;p2;p3;p4;(p5+1);p6;p7;p8;p9;p10;p11;p12;p13;p14] 
     |(1,0) -> [p1;p2;p3;p4;p5;(p6+1);p7;p8;p9;p10;p11;p12;p13;p14] 
     |(1,1) -> [p1;p2;p3;p4;p5;p6;(p7+1);p8;p9;p10;p11;p12;p13;p14] 
     |(1,2) -> [p1;p2;p3;p4;p5;p6;p7;(p8+1);p9;p10;p11;p12;p13;p14] 
     |(1,3) -> [p1;p2;p3;p4;p5;p6;p7;p8;(p9+1);p10;p11;p12;p13;p14] 
     |(2,1) -> [p1;p2;p3;p4;p5;p6;p7;p8;p9;(p10+1);p11;p12;p13;p14] 
     |(2,2) -> [p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;(p11+1);p12;p13;p14] 
     |(3,0) -> [p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;(p12+1);p13;p14] 
     |(3,1) -> [p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;p12;(p13+1);p14] 
     |_ ->  [p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;p12;p13;(p14+1)] 
    |_ -> match (validate (List.item(0) SS) (List.item(n) SS)) with 
     |(0,0) -> (possibilityGuess (n+1) (p1+1) p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(0,1) -> (possibilityGuess (n+1) p1 (p2+1) p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(0,2) -> (possibilityGuess (n+1) p1 p2 (p3+1) p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(0,3) -> (possibilityGuess (n+1) p1 p2 p3 (p4+1) p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(0,4) -> (possibilityGuess (n+1) p1 p2 p3 p4 (p5+1) p6 p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(1,0) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 (p6+1) p7 p8 p9 p10 p11 p12 p13 p14 SS) 
     |(1,1) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 (p7+1) p8 p9 p10 p11 p12 p13 p14 SS) 
     |(1,2) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 (p8+1) p9 p10 p11 p12 p13 p14 SS) 
     |(1,3) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 (p9+1) p10 p11 p12 p13 p14 SS) 
     |(2,1) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 p9 (p10+1) p11 p12 p13 p14 SS) 
     |(2,2) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (p11+1) p12 p13 p14 SS) 
     |(3,0) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (p12+1) p13 p14 SS) 
     |(3,1) -> (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (p13+1) p14 SS) 
     |_ ->  (possibilityGuess (n+1) p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (p14+1) SS) 
printfn "%A" (possibilityGuess 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 S) 

所以它是在第二行中我試圖匹配List.length SS.[n..] with 1`這就是我不能明白爲什麼這個問題?

n是一個從0開始併爲每次遞歸調用加1的整數。

我嘗試重新安排它,所以我會匹配1x when x = List.length SS.[n..]這給出了相同的錯誤。

因此,據我瞭解,它不會接受SS.[n..]在一個匹配模式,這真讓我困惑,因爲我知道這個表達式可以在其他情況下工作。

請幫幫我。

回答

2

事實上,你在做SS.[n..]match不是問題;真正的問題(如錯誤信息直接顯示的)是在SS.[n..]處,SS的類型未知。事實上,您將該表達式的結果傳遞給List.length並不會幫助,因爲任何支持切片的類型可能會返回一個列表。給SS一個明確的類型註釋,一切都很好:

let rec possibilityGuess n p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (SS:list<_>) = 
    ...