Programación orientada a objetos en Haskell

Estoy tratando de comprender la programación de estilo orientado a objetos en Haskell, sabiendo que las cosas van a ser un poco diferentes debido a la falta de mutabilidad. He jugado con clases de tipo, pero mi comprensión de ellas se limita a ellas como interfaces. Así que he codificado un ejemplo de C ++, que es el diamante estándar con una base pura y una herencia virtual.Bat heredaFlying yMammal, y ambosFlying yMammal heredarAnimal.

#include <iostream>

class Animal
{
public:
    virtual std::string transport() const = 0;
    virtual std::string type() const = 0;
    std::string describe() const;
};

std::string Animal::describe() const 
    { return "I am a " + this->transport() + " " + this->type(); }

class Flying : virtual public Animal 
{
public:
    virtual std::string transport() const;
};

std::string Flying::transport() const { return "Flying"; }

class Mammal : virtual public Animal 
{
public:
    virtual std::string type() const;
};

std::string Mammal::type() const { return "Mammal"; }

class Bat : public Flying, public Mammal {};

int main() {
    Bat b;
    std::cout << b.describe() << std::endl;
    return 0;
}

Básicamente estoy interesado en cómo traducir una estructura de este tipo en Haskell, básicamente eso me permitiría tener una lista deAnimals, como podría tener una serie de punteros (inteligentes) paraAnimals en C ++.

Respuestas a la pregunta(4)

Su respuesta a la pregunta