При создании змеи в консольном приложении F # я использовал следующий код для обновления окна консоли.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: если кто-нибудь знает способ упростить вещи, пожалуйста долю.
Ну, ничего страшного в вашей первой версии. В вашем втором случае вы будете сопоставлять anyting 'i, j' с' px, py', потому что вы просто соответствуете любому кортежу. Вам нужно поставить на охрану или использовать активный шаблон. См. [Variable Pattern] (https://msdn.microsoft.com/visualfsharpdocs/conceptual/pattern-matching-%5bfsharp%5d/) – s952163
Существует так много дубликатов - вам нужно использовать что-то вроде '| i, j, когда i = px && j = py' –
Вот несколько дубликатов: http: //stackoverflow.com/questions/17272899/f-odd-pattern-matching-issues http://stackoverflow.com/questions/18649541/how -do-я-сравнить-х-и-у-в-е –