"TENUC70" < TENUC70%40YAHOO.COM">TENUC70
YAHOO.COM> WRITES:
> CAN YOU IDENTIFY THE PROBLEM HERE?
> WHY ARE THE TYPE CONSTRAINTS NOT WORKING?
>
> 1. $ OCAMLOPT TEST_TYPE.MLI TEST.ML
>
> FILE "TEST.ML", LINE 4, CHARACTERS 0-186:
> SIGNATURE MISMATCH:
> MODULES DO NOT MATCH:
> SIG TYPE T = P.T VAL INIT : 'A -> 'B -> 'A * 'B END
> IS NOT INCLUDED IN
> TEST_TYPE.BASETYPE
> VALUES DO NOT MATCH:
> VAL INIT : 'A -> 'B -> 'A * 'B
> IS NOT INCLUDED IN
> VAL INIT : STRING -> INT -> T
>
>
> 2. INIT IN MAKEBASE() COMMENTED OUT AND SECOND VERSION OF INIT
> UNCOMMENTED (I.E. EXPLICIT TYPES ARE GIVEN FOR EVERYTHING)
> $ OCAMLOPT TEST_TYPE.MLI TEST.ML
> FILE "TEST.ML", LINE 9, CHARACTERS 43-54:
> THIS EXPRESSION HAS TYPE STRING * INT BUT IS HERE USED WITH TYPE T = P.T
>
>
> ----- TEST_TYPE.MLI ATTACHED HERE ---------
> MODULE TYPE PARAMTYPE =
> SIG
> TYPE T
>
> VAL IS_TRUE: T -> BOOL
> END
>
> MODULE TYPE BASETYPE =
> SIG
> TYPE T
>
> VAL INIT: STRING -> INT -> T
> END
>
> MODULE MAKEBASE(P : PARAMTYPE) : BASETYPE WITH TYPE T = P.T
> ----- END OF TEST_TYPE.MLI ---------------
>
>
> ------- TEST.ML BEGINS -------------
> OPEN TEST_TYPE
>
> MODULE MAKEBASE(P : PARAMTYPE) : BASETYPE =
> STRUCT
> TYPE T = P.T
>
> LET INIT TEXT LEN = (TEXT, LEN)
> (* LET INIT (TEXT: STRING) (LEN:INT) : T = (TEXT, LEN) *)
>
> (* THE SECOND DEFINITION WITH EXPLICIT TYPES FAILS ALSO *)
> END
A FUNCTOR IS A "FUNCTION" FROM MODULE TO MODULE. YOURS IS DECLARED OF
TYPE PARAMTYPE -> BASETYPE SO IT MUST ACCEPT ANY MODULE OF TYPE
PARAMTYPE, AND FROM IT BUILD A MODULE OF TYPE BASETYPE.
THERE YOU MODULE CAN ONLY BE APPLIED IF TYPE T IS STRING * INT, BUT
THIS IS NOT DECLARED IN THE PARAMTYPE MODULE TYPE. SO THIS CANNOT
WORK.
YOU HAVE TO CHOOSE :
- ONE POSSIBILITY IS TO MAKE THE PARAMTYPE.T A CONCRET TYPE (THAT IS
STRING * INT), AND THE N YOU CAN USE THIS FACT.
- ANOTHER IS TO MAKE THIS TYPE ABSTRACT, THEN THE FUNCTOR CAN ONLY
MANIPULATE IT THROUGH FUNCTION DECLARED IN PARAMTYPE, AND INIT MUST BE
PART OF IT (OR SOME OTHER WAY TO BUILD A T FROM AN INT AND A STRING).
--
RéMI VANICAT
.