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<_>) = 
    ...