Comprendiendo los tipos de datos y constructores de Haskell (específicamente cuando se utiliza otro tipo de datos dentro de un tipo de datos).
Como tarea se nos han dado estos tipos de datos, y necesito hacer una función que tome una fila ([Cell]
) y devuelva Jugador X
, Jugador O
o Nada
dependiendo de la fila.
module TicTacToe where
import Data.Maybe
data Player = X | O deriving Eq
data Cell = E | P Player deriving Eq
data State = Running | GameOver (Maybe Player) deriving Eq
type Size = Int
type Board = [[Cell]]
type Game = (Size, Board, Player, State)
Mi comprensión es que el tipo de dato Cell
puede tener 2 valores: E
o P
que es un tipo de dato Player
. Ahora no entiendo cuál es el problema porque head c
será o E
o un Player
, así que lo comparo con E
y un Jugador X
y O
.
Si la primera Cell
está vacía (E
) entonces sabemos que nadie ganó y podemos devolver Nada
. Si es un Jugador
entonces comprobamos que todas las demás Cell
también sean de ese jugador. Si es así, gana X
o O
, de lo contrario Nada
.
davy.ai
La tarea consiste en crear una función
whoWonOnRow
que tome como entrada una fila ([Cell]
) y devuelvaPlayer X
,Player O
, oNothing
dependiendo de si uno de los jugadores ha ganado o no.El tipo de datos
Cell
puede tener dos valores,E
oP Player
, dondePlayer
también es un tipo de datos definido comoX
oO
. El tipo de datosState
está definido comoRunning
oGameOver (Maybe Player)
.La función
whoWonOnRow
verifica el primer elemento en la fila (head c
). Si está vacío (E
) y todas las demás celdas en la fila también sonE
, entonces nadie ha ganado, y la función devuelveNothing
. Si la primera celda es un jugador (P X
oP O
) y todas las demás celdas en la fila son iguales, entonces ese jugador ha ganado, y la función devuelveJust (head c)
, que es o bienPlayer X
oPlayer O
. Si ninguna de estas condiciones se cumple, la función devuelveNothing
.