问题描述
|
我有以下功能:
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
表示任何数字(因为在Data Grid中为特定类型指定了Int
),但是这根本行不通!我考虑过使用where
子句,但是如果还有其他想法,将不胜感激。谢谢。
解决方法
借助camccann的解决方案:
type Board = [[Grid]]
isTaken :: Grid -> Bool
isTaken (Taken _) = True
isTaken Open = False
myOwn :: Coordin -> Board -> Bool
myOwn (x,y) board = isTaken (board !! y !! x)
,保护后的表达式是布尔谓词,而不是模式绑定。因此,您无法将Taken n
与计算出的值匹配,并将值绑定到n
。
本质上,警卫等效于此:
myOwn (x,y) grid = if board !! y !! x == Taken n
then True
else False
除了多余的“ 8”语句外,很明显在这种情况下您不能绑定“ 1”。
要执行您要尝试的操作,您需要另一个模式匹配:
myOwn (x,y) grid = case board !! y !! x of
Taken n -> True
...
但是,由于您实际上并未在此处使用n
的值,因此最好编写一个单独的函数来为其服务:
isTaken (Taken _) = True
isTaken Open = False
...然后守卫那个。
顺便说一句,在风格上,后卫表达中有很多丑陋的多余的括号。您应该删除那些。
,myOwn (x,y) grid = not (board !! y !! x == Open)