我刚开始学习F#,所以这可能是一个简单的问题,但我不明白为什么我的代码中的模式匹配会起作用。
代码的快速解释:
函数calcNextMatch应该递归一个列表,如果两个元素相等,则它们应该相加。
最后,该函数应返回一个数字,该数字是所有具有与列表中下一个数字匹配的数字的总和。
例如 [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
当我运行这段代码时,问题在于模式匹配并没有按照我预期的方式工作。例如,从运行脚本中输出的打印结果。
h: 1
t: Some(3)
TAIL t: 3 is equal to HEAD h: 3
这意味着F#已经匹配成功。
match t with
| Some h ->
在 t = Some(3) 且 h = 1 的情况下,翻译成:
match 3 with
| Some 1 ->
我不理解这个问题。
在匹配前的打印输出中,t和h的值为3和1,但是在模式匹配中,h的值已经改变为3
这是怎么可能的?