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的新手,所以我没有更好的主意.
我们可以通过列表推导获得所有职位(另请参阅其他答案)
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)
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |