как представить `n` как последовательность чисел - PullRequest
2 голосов
/ 25 мая 2011

У меня есть следующая функция:

type Coordin = (Int,Int)

data Grid = Open
          | Taken Int

myOwn :: Coordin -> Grid -> Bool
myOwn (x,y) grid  
    | ((board)!!(y)!!(x)) == Taken n           = True
    | otherwise                                = False

Я бы хотел, чтобы n означало любое число (поскольку Int указано как таковое в Data Grid для этого конкретного типа), но это просто не будет работать !! Я думал об использовании предложения where, но если есть какие-то другие идеи, это будет высоко ценится. Спасибо.

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

С вдохновением от решения Камбканна:

type Board = [[Grid]]

isTaken :: Grid -> Bool
isTaken (Taken _) = True
isTaken Open      = False

myOwn :: Coordin -> Board -> Bool
myOwn (x,y) board = isTaken (board !! y !! x)
3 голосов
/ 25 мая 2011

Выражение после охранника является логическим предикатом, а не привязкой к шаблону. Таким образом, вы не можете сопоставить 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

... а затем защититься этим.

Между прочим, в стилистическом плане у вас много отвратительных лишних скобок в вашем охранном выражении; Вы должны удалить их.

0 голосов
/ 26 мая 2011
myOwn (x,y) grid = not (board !! y !! x  == Open)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...