我有以下功能:
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
在数据网格中为该特定类型指定了这样的数字)但事情就是不起作用!!我想过使用where
条款,但如果有任何其他想法,我会非常感激。感谢。
答案 0 :(得分:4)
灵感来自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)
答案 1 :(得分:3)
保护之后的表达式是布尔谓词,而不是模式绑定。因此,您无法将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
......然后用它来保护。
顺便说一下,在一个风格点上,你的守护表达中有很多丑陋的多余括号;你应该删除它们。
答案 2 :(得分:0)
myOwn (x,y) grid = not (board !! y !! x == Open)