Как сделать гетерогенный список в 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