如何解决如何将“ n”表示为一系列数字
| 我有以下功能: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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。