Así que me doy cuenta de que es un posible duplicado pregunta, ya que hay una serie de esos errores informados en Stack Overflow, pero ninguna de las soluciones parece aplicarse a mi problema.Haskell, Aunque mi tipo no se especifica me sale este error: No se puede emparejar el tipo `a 'con` [a]', `a 'es una variable de tipo rígida limitada por
Así que tienen la siguiente función:
elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
where yminus1 = y - 1
En caso de que esté preguntando que es un problema de 3 99 Haskell Problems. El objetivo de la función es tomar como entrada una lista y un índice, y devolver el valor en ese índice (comenzando en 1). No quiero una solución al problema; si lo hiciera, podría ver los que se proporcionan. Pero me aparece un error que no entiendo. Estoy usando eclipseFP, el plugin Eclipse para Haskell y Es subrayando la "[x: _]" y "[x: xs]" porciones de la función con el siguiente error:
Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a
En todos los hilos que discuta este error que he observado el problema generalmente ocurre cuando alguien intenta dar un resultado incorrecto a algo que espera un cierto tipo. Por ejemplo, devolver la longitud de algo (que es de tipo Int) a lo que debería ser un tipo de variable "Num a".
Pero en mi caso ni siquiera estoy proporcionando un tipo para la variable a. Debería poder ser CUALQUIER COSA, ¿verdad? Entonces, ¿por qué estoy recibiendo este error? Si entendía por qué estaba obteniendo el error, podría solucionarlo, pero simplemente no entiendo.
¿Podría alguien explicarme por qué estoy recibiendo este error?
Su ayuda es muy apreciada, gracias. -Asaf
Editar: Todas las respuestas proporcionadas hasta el momento es correcta, gracias a todos por la útil información. Voy a elegir el que creo que es más claro (tengo que esperar 5 minutos para hacerlo).
¿por qué no simplemente escribir '' elementAt '[x: xs] y = elementoAt' xs (y-1) '' –
@Vixen ¿Cómo es eso diferente de lo que escribí ... aparte de incluir una declaración de variable? Obviamente, el compilador terminaría haciendo exactamente lo mismo en ambos casos (corrígeme si me equivoco). – Asaf
Sí, es lo mismo, solo creo que parece extraño declarar algo como yminus1, cuando y-1 lee más fácilmente y se ve más bonito en mi opinión –