INTERFACE の動作がわからん

ワカランのが INTERFACE の動作なのかもわからない。MODULE の変数のスコープに関する動作を理解できていないのだろう。走らないコードと走るコードを以下に示す

MODULE typedef
  TYPE real8x10
    REAL(8):: e(10)
  END TYPE
  INTERFACE OPERATOR (+) ! 外部手続を使って定義しようとした
    FUNCTION add_ (A,B)
      USE typedef
      TYPE(real8x10),INTENT(IN):: A,B
      TYPE(real8x10):: add_
    END FUNCTION
  END INTERFACE
END MODULE

PROGRAM main
  USE typedef
  TYPE(real8x10):: A,B
  A%e=1.d0; B%e=2.d0; WRITE(*,*) A+B;
END PROGRAM

FUNCTION add_ (A,B) RESULT (C) ! 計算の本体はここ
  USE typedef
  TYPE(real8x10),INTENT(IN):: A,B
  TYPE(real8x10):: C
  C%e= A%e + B%e
END FUNCTION

走るコード1

MODULE typedef
  TYPE real8x10
    REAL(8):: e(10)
  END TYPE
  INTERFACE OPERATOR (+)
    MODULE PROCEDURE add ! MODULE PROCEDURE 文で呼び出す
  END INTERFACE
CONTAINS
  FUNCTION add (A,B) RESULT (C) ! 手続をMODULE内部に組み込んだ
    TYPE(real8x10),INTENT(IN):: A,B
    TYPE(real8x10):: C
    C%e= A%e + B%e
  END FUNCTION
END MODULE

PROGRAM main
  USE typedef
  TYPE(real8x10):: A,B
  A%e=1.d0; B%e=2.d0; WRITE(*,*) A+B;
END PROGRAM

走るコード2

MODULE typedef
  TYPE real8x10
    REAL(8):: e(10)
  END TYPE
END MODULE

MODULE operatordef ! モジュールを分離した
  INTERFACE OPERATOR (+)
    FUNCTION add_ (A,B)
      USE typedef
      TYPE(real8x10),INTENT(IN):: A,B
      TYPE(real8x10):: add_
    END FUNCTION
  END INTERFACE
END MODULE

PROGRAM main
  USE typedef
  USE operatordef
  TYPE(real8x10):: A,B
  A%e=1.d0; B%e=2.d0; WRITE(*,*) A+B;
END PROGRAM

FUNCTION add_ (A,B) RESULT (C) ! 計算の本体はここ
  USE typedef
  TYPE(real8x10),INTENT(IN):: A,B
  TYPE(real8x10):: C
  C%e= A%e + B%e
END FUNCTION