Как сделать гетерогенный список в Haskell? (изначально на Java)

Как преобразовать следующую реализацию Java в Haskell?

Основной целью здесь является создание списка, который содержит различные элементы, которые являются подтипом определенного интерфейса.

Я попытался сделать версию на Haskell ниже, но не смог достичь своей цели. Дело здесьxs имеет тип[Bar] скорее, чемFoo a => [a]

Означает ли это, что Хаскелл не может сделать это, и я должен думать по-другому?

Джава

interface Foo {
    void bar ();
}

public class Bar1 implements Foo {
    @Override
    public void bar() {
        System.out.println("I am bar 1 class");
    }   
}

public class Bar2 implements Foo {
    @Override
    public void bar() {
        System.out.println("I am bar 2 class");
    }   
}

public static void main(String[] args) {
    // The major purpose here is having a list 
    // that contains elements which are sub-type of "Foo"
    List ys = new ArrayList();

    Foo e1 = new Bar1();
    Foo e2 = new Bar2();

    ys.add(e1);
    ys.add(e2);

    for (Foo foo : ys) {
        foo.bar();
    }
}

Haskell

class Foo a where
  bar :: a -> IO ()

data Bar = Bar1 | Bar2

instance Foo Bar where
  bar Bar1 = print "I am Bar1"
  bar Bar2 = print "I am Bar2"

--xs :: Foo a => [a]
xs :: [Bar]
xs = [Bar1, Bar2]

main :: IO ()
main = mapM_ bar xs

Ответы на вопрос(4)

Ваш ответ на вопрос