LINUX.ORG.RU

История изменений

Исправление 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());

  }
}

не благодари, т.к. незачто.