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..] with1` 这就是我无法理解的问题,为什么?

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

我尝试重新排列它,以便将1x 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)..] 匹配模式中的错误的主要内容,如果未能解决你的问题,请参考以下文章

Argument list too long......

missing ) after argument list

argument list啥意思啊?

关于arguments映射的问题

type argument cannot be of primitive type错误

Python_异常:TypeError: write() argument must be str, not list