List F#:列出匹配模式中的。[(参数)…]错误

List F#:列出匹配模式中的。[(参数)…]错误,list,indexing,f#,match,List,Indexing,F#,Match,我已经创建了一个函数,希望在其中匹配从给定索引到列表末尾的列表长度。例子。list.[4..]将为您提供一个新列表,其中包含从索引4到末尾的列表中的元素。我知道这是真的,因为我已经做了很多次了 但现在,当我尝试在匹配模式中执行此操作时,它会出错: “基于此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型批注来约束对象的类型。这可能允许解析查找。” 我的代码如下所示: let rec possibilityGuess n p1 p2 p3 p4 p5 p6 p7 p8 p9 p1

我已经创建了一个函数,希望在其中匹配从给定索引到列表末尾的列表长度。例子。list.[4..]将为您提供一个新列表,其中包含从索引4到末尾的列表中的元素。我知道这是真的,因为我已经做了很多次了

但现在,当我尝试在匹配模式中执行此操作时,它会出错:

“基于此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型批注来约束对象的类型。这可能允许解析查找。”

我的代码如下所示:

 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..]与
1]匹配,这就是我无法理解的问题,为什么

n是一个整数,从0开始,每次递归调用加1

我尝试重新排列它,以便在x=List.length SS时将
1
x进行匹配。[n..]
这会给出相同的错误

因此,据我所知,它不会接受匹配模式中的
SS.[n..]
,这让我很困惑,因为我知道这个表达式在其他情况下也适用


请帮帮我

事实上,你在
匹配中做的
SS.[n..]
不是问题所在;真正的问题(由错误消息直接指出)是,在您执行
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<_>) =
   ...
let rec posabilityguess n p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14(SS:list)=
...