No, this is not so, but what you ask for is easy to implement:
ask(Pid, M) ->
Promise = erlang:monitor(process, Pid),
Pid ! {ask, Promise, M},
Promise.
Waiting for the result of the promise, you can now do:
force(Promise, Timeout) ->
receive
{result, Promise, R} ->
erlang:demonitor(Promise, [flush]),
{ok, R};
{'DOWN', Promise, process, _, Reason} ->
{error, {callee_died, Reason}}
after Timeout -> {error, timeout}
end.
If you do not want to do anything between request and force, you can use the OTP behavior gen_server, which has it gen_server:call/3, basically implementing these two functions at a time.
Please note that in the above example, we request a monitor link to the target Pid, which allows us to track it if it dies. We also use this link as a unique tag for a promise, so that we can find it among other messages that look like in a mailbox.