Erlang query string builder and parser

Erlang
-module(query_string).
-export([encode/1, parse/1]).

encode(Pairs) ->
    uri_string:compose_query([{to_list(K), to_list(V)} || {K, V} <- Pairs]).

parse(Qs) ->
    try uri_string:dissect_query(Qs) of
        Pairs -> {ok, [{to_list(K), to_list(V)} || {K, V} <- Pairs]}
    catch
        _:_ -> {error, invalid_query}
    end.

to_list(true) -> "";
to_list(V) when is_binary(V) -> binary_to_list(V);
to_list(V) when is_integer(V) -> integer_to_list(V);
to_list(V) when is_atom(V) -> atom_to_list(V);
to_list(V) when is_list(V) -> V.