【发布时间】:2016-07-22 12:47:39
【问题描述】:
在 F# 控制台应用程序中构建蛇时,我使用以下代码更新控制台窗口。
//Sets the next character in accumulator
//(i, j) are the coordinates of the game
//(px, py) are the coordinates of snake's head
let rec setConsoleChar acc i j px py =
if i=px && j=py then
setConsoleChar (acc+"H") (i+1) j px py
else
match i, j with
| ...
但我不禁想知道(px, py) 的比较是否也可以在模式匹配块中。我尝试使用以下代码,但是当命中时,(i, j) 指针更改为指向(px, py),这导致错误的返回值只包含“H”。
match i, j with
| px, py -> setConsoleChar (acc+"H") (i+1) j px py
| ...
PS:如果有人知道简化事情的方法,请分享。
【问题讨论】:
-
好吧,你的第一个版本没有问题。在第二种情况下,您将匹配任何
i, j和px, py,因为您只是匹配任何元组。您需要在其上放置一个 when 守卫,或者使用活动模式。见Variable Pattern -
有很多重复的 - 你需要使用类似
|i,j when i=px && j=py
标签: recursion f# arguments pattern-matching