[x] U is not a player, and does not make sense in a number of places you use Player (Victory, Macrogame (see below). As much as it may pain you to do so, it really needs to be split into two types (one of which will probably hold the other).
[x] More importantly, you seem to be keeping winners in the boards and the game - but not the current player! Also, what if the player has restrictions on where he can play?
[ ] Winners should probably not be stored in the game state, they are something computed about the game state. I would argue that even your microboards shouldn't hold BOTH a board and a winner: you can compute the winner from the board. If you want to REPLACE the board with the winner, that might make sense.
@joey12725 @Jjiang2002 @ColinHouston @pharris-trinity
https://github.com/TU-CSCI2322-FL22/solver-connect-three/blob/9aebb7013b2a929d3d782a0fdb4c88210bc1d7f6/Main.hs#L2