Выражение после охранника является логическим предикатом, а не привязкой к шаблону. Таким образом, вы не можете сопоставить Taken n
с вычисленным значением и связать значение с n
.
По сути, охранник эквивалентен этому:
myOwn (x,y) grid = if board !! y !! x == Taken n
then True
else False
Помимо лишнего оператора if
, должно быть очевидно, что в этом контексте нельзя связывать n
.
Чтобы сделать то, что вы пытаетесь, вам понадобится еще одно совпадение с шаблоном:
myOwn (x,y) grid = case board !! y !! x of
Taken n -> True
...
Но, поскольку вы на самом деле здесь не используете значение n
, вам лучше будет написать отдельную функцию:
isTaken (Taken _) = True
isTaken Open = False
... а затем защититься этим.
Между прочим, в стилистическом плане у вас много отвратительных лишних скобок в вашем охранном выражении; Вы должны удалить их.