Jak utworzyć heterogeniczną listę w Haskell? (pierwotnie w Javie)

Jak przekonwertować następującą implementację Java na Haskell?

Głównym celem jest tutaj lista zawierająca różne elementy, które są podtypem konkretnego interfejsu.
Próbowałem stworzyć wersję Haskella poniżej, ale nie spełniłem swojego celu. Chodzi o toxs ma typ[Bar] zamiastFoo a => [a]

Czy to oznacza, że ​​Haskell nie może tego zrobić i czy powinienem myśleć w inny sposób?

Jawa

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<Foo> ys = new ArrayList<Foo>();

    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

questionAnswers(4)

yourAnswerToTheQuestion