Quick actions

cmd+k|ctrl+k

Navigation

Languages

Example of using type erasure in a partially instantiated typeclass use

Snippet info

Language

Mercury

Visibility

public

Author

alaskanemily

Created

2019-06-13T21:59:29Z

Updated

2019-06-13T21:59:29Z

:- 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).
INFO