Tengo dos registros que tienen un campo que quiero extraer para su visualización. ¿Cómo organizo las cosas para que puedan ser manipuladas con las mismas funciones? Como tienen campos diferentes (en este caso firstName
y buildingName
) que son sus campos de nombre, cada uno de ellos necesita un código de "adaptador" para asignar firstName
a name
. Aquí es lo que tengo hasta ahora:¿Cómo se define una clase que permite el acceso uniforme a diferentes registros en Haskell?
class Nameable a where
name :: a -> String
data Human = Human {
firstName :: String
}
data Building = Building {
buildingName :: String
}
instance Nameable Human where
name x = firstName x
instance Nameable Building where
-- I think the x is redundant here, i.e the following should work:
-- name = buildingName
name x = buildingName x
main :: IO()
main = do
putStr $ show (map name items)
where
items :: (Nameable a) => [a]
items = [ Human{firstName = "Don"}
-- Ideally I want the next line in the array too, but that gives an
-- obvious type error at the moment.
--, Building{buildingName = "Empire State"}
]
Esto no se compila:
TypeTest.hs:23:14:
Couldn't match expected type `a' against inferred type `Human'
`a' is a rigid type variable bound by
the type signature for `items' at TypeTest.hs:22:23
In the expression: Human {firstName = "Don"}
In the expression: [Human {firstName = "Don"}]
In the definition of `items': items = [Human {firstName = "Don"}]
lo que habría esperado la sección instance Nameable Human
sería hacer este trabajo. ¿Alguien puede explicar lo que estoy haciendo mal y, para los puntos de bonificación, qué "concepto" estoy tratando de poner en práctica, ya que tengo problemas para saber qué buscar?
This question parece similar, pero no pude averiguar la conexión con mi problema.
Si elimina la anotación de tipo para 'elementos', entonces funciona ... Sin embargo, los elementos tienen el tipo' [Humano] '(¿qué tal vez no es lo que quiere?) – phynfo