Here is code that provoked this error (though the error message as been made more specific in later releases):
ghost function Eval(): string -> bool {
EvalOperator(Dummy)
}
ghost function EvalOperator(op: string -> bool): string -> bool
{
(v: string) => op(v)
}
function Dummy(str: string): bool
requires str == []
The problem has to do with arrow types.
In particular here, the argument of EvalOperator
takes a ->
function, which is a total, heap-independent function.
However, its argument, Dummy
, is a partial, heap-independent function, because it has a precondition.
If you want EvalOperator
to be flexible enough to take partial functions, then declare op
to have the type
string --> bool
.
There is more on arrow types in the reference manual;