:- module main.
%=============================================================================%
:- interface.
%=============================================================================%
:- import_module io.
%-----------------------------------------------------------------------------%
:- typeclass stringify_concatenate(A, B) where [
func stringify_concatenate(A, B) = string
].
%-----------------------------------------------------------------------------%
:- instance stringify_concatenate(string, int).
%-----------------------------------------------------------------------------%
:- type partial(T).
%-----------------------------------------------------------------------------%
:- func create_partial(A) = partial(B) <= stringify_concatenate(A, B).
%-----------------------------------------------------------------------------%
:- func finalize(partial(B), B) = string.
%-----------------------------------------------------------------------------%
:- pred main(io::di, io::uo) is det.
%=============================================================================%
:- implementation.
%=============================================================================%
:- use_module string.
%-----------------------------------------------------------------------------%
:- instance stringify_concatenate(string, int) where [
stringify_concatenate(Str, I) = string.append(Str, string.from_int(I))
].
%-----------------------------------------------------------------------------%
:- type partial(T) --->
partial(func(T) = string).
%-----------------------------------------------------------------------------%
create_partial(A) = partial(stringify_concatenate(A)).
%-----------------------------------------------------------------------------%
finalize(partial(Func), B) = Func(B).
%-----------------------------------------------------------------------------%
main(!IO) :-
create_partial("ABC") = Partial,
finalize(Partial, 123) = Str,
io.write_string(Str, !IO), io.nl(!IO).