迭代所有(行,列)的可能性?

use*_*390 3 haskell loops list

这将是一个TicTacToe实现:

data Row    = A | B | C  deriving (Show, Read, Eq, Ord, Enum, Bounded)
data Column = X | Y | Z  deriving (Show, Read, Eq, Ord, Enum, Bounded)
type Pos = (Row, Column)
data Player = Player String
data Field = Field [(Pos, Player)]
initialField :: Field
initialField = Field []
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,initialField只是一个空列表,当玩家进行移动时,(pos,player)tupels将被添加到列表中.到现在为止还挺好.但是现在我在编写一个possibleMoves :: Field -> [Pos]函数来获取空字段时遇到了麻烦.如何迭代Haskell中的所有Row,Column可能性?我觉得我的方法是错的,但我是Haskell的新手,所以我没有更好的主意.

ist*_*rdy 5

我们可以通过列表推导获得所有职位(另请参阅其他答案)

positions :: [Pos]
positions = [(r,c) | r <- [A,B,C], c <- [X,Y,Z]]
Run Code Online (Sandbox Code Playgroud)

和所有玩地图

occupied :: Field -> [Pos]
occupied (Field l) = fmap fst l
Run Code Online (Sandbox Code Playgroud)

然后我们可以定义possibleMoves(你需要导入Data.List来获取\\,列出差异):

possibleMoves :: Field -> [Pos]
possibleMoves f = positions \\ (occupied f)
Run Code Online (Sandbox Code Playgroud)

更紧凑的版本利用了列表理解约束:

possibleMoves :: Field -> [Pos]
possibleMoves (Field l) = [(r,c) | r <- [A,B,C], c <- [X,Y,Z], (r,c) `notElem` occupied]
  where occupied = fmap fst l
Run Code Online (Sandbox Code Playgroud)