Actually there should be an 0 or X in the example game.. I think. The typesystem should validate the (explicit) alternating players, here it seems to alternate 'automatically', not going through compiler validation (?)

Also testing this, I was able to place for example an X into a field already set by an O, this should not be possble. So the Haskell version validates moves quite differently I think.