Как преобразовать следующую реализацию Java в Haskell?Как сделать гетерогенный список в Haskell? (изначально в Java)
Основная цель здесь - иметь список, который содержит различные элементы, которые являются подтипом конкретного интерфейса.
Я попытался сделать версию Haskell ниже, но не смог выполнить свою задачу. Дело здесь xs
имеет тип [Bar]
, а не Foo a => [a]
ли это, что Haskell не может это сделать, и мне кажется, по-другому?
Java
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
Ваша реализация в Haskell выглядит хорошо для меня. Я даже зашел так далеко и скажу, что правильный перевод: 'bar1 =" I'm Bar1 "; bar2 = "Я Bar2"; xs = [bar1, bar2]; main = mapM_ putStrLn xs' – kosmikus
Фактически, дело в том, что для этого есть список элементов, реализующих определенный интерфейс. – Simon
Да, но этот интерфейс (в данном случае) типа 'String', или, возможно,' IO String'. – kosmikus