F#模式匹配出错了

我刚刚开始使用F#,所以这可能是一个微不足道的问题,但我无法理解为什么我的代码中的模式匹配就像它一样行事。代码的F#模式匹配出错了

快速解释:
的FUNC calcNextMatch应该递归一个列表,如果2个元素是相等的它们应该被加在一起。 最后,func应该返回一个数字,即添加与列表中下一位数字匹配的所有数字。
f.ex. [1; 3; 2; 2; 5]应返回4

代码:

let rec printList l = 

match l with

| head :: tail -> printf "%d " head; printList tail

| [] -> printfn ""

let rec calcNextMatch list =

printList list

match list with

| [] -> 0

| _ :: tail ->

printList tail

let h = Seq.head list

let t = Seq.tryHead tail

printfn "h: %i" h

printfn "t: %O" t

match t with

| Some h ->

printfn "TAIL t: %i is equal to HEAD h: %i" t.Value h

printfn "Calculation is: %i" (t.Value + h)

(t.Value + h) + calcNextMatch tail

| _ -> calcNextMatch tail

let sequence = [ 1;3;2;2;5 ]

let run = calcNextMatch sequence

当运行该代码的问题是,模式匹配 如我期望它不起作用。从运行脚本f.ex f.ex打印输出。

h: 1 

t: Some(3)

TAIL t: 3 is equal to HEAD h: 3

这意味着F#已在的情况下匹配

match t with 

| Some h ->

其中t =一些(3)和h = 1 其转换为

match 3 with 

| Some 1 ->

和我不理解。 匹配状态之前打印吨和h的给和但在值的模式匹配的ħ值已更改为
这是如何实现?

回答:

您只能对常量字面值进行匹配模式匹配,否则该值会像有新的绑定一样受限制。

在这种情况下,你做正常的是添加when条件:

match t with 

| Some x when x = h ->

另请注意,您可以使用模式匹配进一步简化代码,比如这里:

| _ :: tail ->    

printList tail

let h = Seq.head list

你可以这样写:

| h :: tail ->    

printList tail

同样所有这部分:

| _ :: tail ->    

printList tail

let h = Seq.head list

let t = Seq.tryHead tail

printfn "h: %i" h

printfn "t: %O" t

match t with

| Some h ->

printfn "TAIL t: %i is equal to HEAD h: %i" t.Value h

printfn "Calculation is: %i" (t.Value + h)

(t.Value + h) + calcNextMatch tail

变为:

| h :: tail ->    

printList tail

//printfn "h: %i" h

//printfn "t: %O" t

match tail with

| t::_ when t = h ->

printfn "TAIL t: %i is equal to HEAD h: %i" t h

printfn "Calculation is: %i" (t + h)

(t + h) + calcNextMatch tail

而且你可以在统一一个所有比赛,那么你的整个功能变为:

let rec calcNextMatch list = 

printList list

match list with

| [] -> 0

| h::x::tail when x = h -> x + h + calcNextMatch (x::tail)

| _::tail -> calcNextMatch tail

最后,当你与调试完成后,你可以删除打印并且由于您的功能的最后一个参数是您匹配的那个,您可以使用关键字function,也可以使用as模式来避免重新构建列表:

let rec calcNextMatch = function 

| [] -> 0

| h::((x::_) as tail) when x = h -> x + h + calcNextMatch tail

| _::tail -> calcNextMatch tail

以上是 F#模式匹配出错了 的全部内容, 来源链接: utcz.com/qa/259818.html

回到顶部