Learning Haskell with Chess
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This page is about learning Haskell using the board game Chess as a running example. The complete code can be found at http://www.steffen-mazanek.de/dateien/projekte/hsChess.zip.
Exercise 1 - data types
Learning targets
- recapitulate Haskell types (keywords type and data, product and sum types)
- Helium: define equality functions (pattern matching)
- Haskell: define instances of type classes Show, Eq
- pretty printing
Tasks
- Define data types that represent boards (
Board
), squares (Square
), positions (Pos
), pieces (Piece
) and game states (State
). - Helium: Implement suited eq-functions.
- Implement a function
prettyBoard::Board->String
, that transforms a board into a clearly arranged string representation (human readable :-)). Support this function with auxiliary functions that pretty print pieces, squares, ... - Define the initial board (
initialBoard::Board
), test prettyBoard with initialBoard. - Implement a simple evaluation function
evalBoard::Board->Int
as the difference of material on board (values: Pawn->1, Knight and Bishop->3, Queen->9, Rook->6, King->"infinity"=1000).
Exercise 2 - move generator
Learning targets
- list comprehension
- stepwise refinement
Tasks
Exercise 3 - gametree generation and minimax algorithm
Learning targets
- break code in modules
- complexity
- recursive data structures -> recursive algorithms
Tasks
- Define a data type that represents a game tree (
GameTree
). - Roughly estimate the number of nodes of the gametree with depth 4.
- Define a function
play::Gametree->Int
, that computes the value of a given game tree using the minimax Algorithm. - Implement the function
doMove::State->State
, that choses the (best) next state.