Al cargar el siguiente módulo obtengo el error: No hay instancia para (Eq Planet) que surge de un uso de "==" • En la expresión: planeta == Mercurio En un stmt de un patrón de protección para una ecuación para "...

1
timtam 15 mar. 2021 a las 00:18

2 respuestas

La mejor respuesta

Puede trabajar con coincidencia de patrones :

ageOn :: Planet -> Float -> Float
ageOn Mercury seconds = seconds * mercury
ageOn Venus seconds = seconds * venus
ageOn Earth seconds = seconds * earth
ageOn Mars seconds = seconds * mars
ageOn Jupiter seconds = seconds * jupiter
ageOn Saturn seconds = seconds * saturn
ageOn Uranus seconds = seconds * uranus
ageOn Neptune seconds = seconds * neptune

Pero también puede hacer que Planet sea una instancia de la clase de tipos Eq. Si simplemente desea verificar si dos Planet s son iguales si usa el mismo constructor de datos, puede dejar que Haskell implemente esto con una cláusula deriving:

data Planet
  = Mercury
  | Venus
  | Earth
  | Mars
  | Jupiter
  | Saturn
  | Uranus
  | Neptune
  deriving Eq
4
Willem Van Onsem 14 mar. 2021 a las 21:22
ageOn planet seconds = seconds * case planet of
  Mercury -> mercury
  Venus -> venus
  Earth -> earth
  Mars -> mars
  ...

O mejor aún, factoriza la búsqueda.

yearLength :: Planet -> Float
yearLength = \case
  Mercury -> mercury
  Venus -> venus
  ...

ageOn planet seconds = yearLength planet * seconds

Al mismo tiempo, creo que podría tener un error en su lógica. Si he vivido durante 1 año terrestre, he vivido durante más de 1 año Mercurio. Entonces, dependiendo exactamente de lo que significa su función, probablemente desee definir

ageOn planet earthYears = earthYears / yearLength planet
2
Mark Saving 14 mar. 2021 a las 22:34