Estoy tratando de convertir un tipo de datos Haskell simple y una función a OO. Pero estoy confundido ..Haskell datatype to Java (OO)
tener el siguiente tipo de Haskell para el cálculo aritmético:
data Expr = Lit Int |
Add Expr Expr |
deriving Show
--Turn the expr to a nice string
showExpr :: Expr -> String
showExpr (Lit n) = show n
showExpr (Add e1 e2) = "(" ++ showExpr e1 ++ "+" ++ showExpr e2 ++ ")"
Ahora estoy tratando de convertir ..
public interface Expr {
String showExpr(String n);
}
// Base case
public class Lit implements Expr {
String n;
public Lit(String n) {
this.n = n;
}
@Override
public String ShowExpr() {
return n;
}
}
public class Add implements Expr {
Expr a;
Expr b;
public Add(Expr aExpr, Expr bExpr) {
this.a = aExpr;
this.b = bExpr;
}
public String ShowExpr() {
return "(" + a.ShowExpr() + "+" + b.ShowExpr() + ")";
}
public static void main(String[] args) {
Lit firstLit = new Lit("2");
Lit secLit = new Lit("3");
Add add = new Add(firstLit,secLit);
System.out.println(add.ShowExpr());
}
}
Esto dará como resultado "(2 + 3) ", es la respuesta correcta.
Pero ... No estoy seguro ... ¿es esta la manera correcta de pensarlo y modelarlo en OO?
¿No es una buena representación del tipo de datos Haskell?
Creo que su conversión es realmente buena. Lo único que puedo comentar es que Expr debería ser una clase abstracta en lugar de una interfaz. Y no use Java para este tipo de problemas porque Haskell es mucho mejor en esto. – nist