История изменений
Исправление qnikst, (текущая версия) :
public abstract class TreeNode<A> {
interface Visitor<A>{
public void visit(Tip<A> foo);
public void visit(Bin<A> foo);
}
private TreeNode(){};
abstract void accept(Visitor<A> v);
public static final class Tip<A> extends TreeNode<A> {
public String toString() {
return "Tip";
}
public void accept(Visitor<A> v) {
v.visit(this);
}
}
public static final class Bin<A> extends TreeNode<A> {
public final A data;
public final TreeNode<A> left;
public final TreeNode<A> right;
public Bin(TreeNode<A> left, A data, TreeNode<A> right) {
this.data = data;
this.left = left;
this.right = right;
}
public String toString() {
return("Bin(" + this.left.toString() + "," + this.data.toString() + "," + this.right.toString()+")");
}
public void accept(Visitor<A> v) {
v.visit(this);
}
}
static abstract class Fold<A,B> implements Visitor<A> {
private B seed;
abstract B run(B seed, A value);
public Fold(B initial, TreeNode<A> node) {
this.seed = initial;
node.accept(this);
}
public void visit(Tip<A> foo) {
}
public void visit(Bin<A> foo) {
foo.left.accept(this);
this.seed = run(this.seed, foo.data);
foo.right.accept(this);
}
public B deconstruct() {
return this.seed;
}
}
public static void main(String[] args) {
TreeNode<Integer> tip = new Tip<Integer>();
TreeNode<Integer> a = new Bin<Integer>(tip, (Integer)5, new Bin<Integer>(tip,(Integer)7,tip));
System.out.println(a);
Fold<Integer, Integer> fold = new Fold<Integer,Integer>(0, a) {
Integer run(Integer sum, Integer value) {
return(sum +value);
}
};
System.out.println(fold.deconstruct());
}
}
не благодари, т.к. незачто.
Исходная версия qnikst, :
public abstract class TreeNode<A> {
interface Visitor<A>{
public void visit(Tip<A> foo);
public void visit(Bin<A> foo);
}
private TreeNode(){};
abstract void accept(Visitor<A> v);
public static final class Tip<A> extends TreeNode<A> {
public String toString() {
return "Tip";
}
public void accept(Visitor<A> v) {
v.visit(this);
}
}
public static final class Bin<A> extends TreeNode<A> {
public final A data;
public final TreeNode<A> left;
public final TreeNode<A> right;
public Bin(TreeNode<A> left, A data, TreeNode<A> right) {
this.data = data;
this.left = left;
this.right = right;
}
public String toString() {
return("Bin(" + this.left.toString() + "," + this.data.toString() + "," + this.right.toString()+")");
}
public void accept(Visitor<A> v) {
v.visit(this);
}
}
static abstract class Fold<A,B> implements Visitor<A> {
private B seed;
abstract B run(B seed, A value);
public Fold(B initial, TreeNode<A> node) {
this.seed = initial;
node.accept(this);
}
public void visit(Tip<A> foo) {
}
public void visit(Bin<A> foo) {
foo.left.accept(this);
this.seed = run(this.seed, foo.data);
foo.right.accept(this);
}
public B deconstruct() {
return this.seed;
}
}
public static void main(String[] args) {
TreeNode<Integer> tip = new Tip<Integer>();
TreeNode<Integer> a = new Bin<Integer>(tip, (Integer)5, new Bin<Integer>(tip,(Integer)7,tip));
System.out.println(a);
Fold<Integer, Integer> fold = new Fold<Integer,Integer>(0, a) {
Integer run(Integer sum, Integer value) {
return(sum +value);
}
};
System.out.println(fold.deconstruct());
}
}
не благодари, т.к. незачто.