如何将`n`表示为一系列数字

时间:2011-05-25 19:11:23

标签: list variables haskell types

我有以下功能:

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条款,但如果有任何其他想法,我会非常感激。感谢。

3 个答案:

答案 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)