F# : list.[(argument)..] 匹配模式中的错误
Posted
技术标签:
【中文标题】F# : list.[(argument)..] 匹配模式中的错误【英文标题】:F# : list.[(argument)..] errors in Match Pattern 【发布时间】:2017-04-03 21:13:02 【问题描述】:我创建了一个函数,我想在其中匹配从给定索引到列表末尾的列表长度。例子。 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..] with
1` 这就是我无法理解的问题,为什么?
n 是一个 int,从 0 开始,每次递归调用加 1。
我尝试重新排列它,以便将1
与x when x = List.length SS.[n..]
匹配,这会产生相同的错误。
所以据我了解,它不会接受匹配模式中的SS.[n..]
,这真的让我感到困惑,因为我知道这个表达式在其他情况下也可以工作。
请帮助我。
【问题讨论】:
【参考方案1】:您在match
中执行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<_>) =
...
【讨论】:
以上是关于F# : list.[(argument)..] 匹配模式中的错误的主要内容,如果未能解决你的问题,请参考以下文章