Effect Casts
An effect cast instructs the compiler that an expression has a specific effect.
Warning️️: Effect casts are by nature extremely dangerous and should be used with utmost caution!
A Flix programmer should not normally use effect casts except in two cases:
- To cast an pure function to an effect polymorphic function.
- To cast a pure function to an impure function.
Both cases are legitimate and safe.
Example: Safe Cast of Pure Function to Effect Polymorphic
Flix does not (yet) have sub-effecting which means that in certain rare cases it can be necessary to manually insert a cast. For example:
def findRight(f: a -> Bool \ ef, l: List[a]): Option[a] \ ef =
def loop(ll, k) = match ll {
case Nil => k()
case x :: xs => loop(xs, () -> if (f(x)) Some(x) else k())
};
loop(l, () -> None as \ ef)
Here the cast () -> None as \ ef
is required because otherwise
the function () -> None
would be pure and not effect polymorphic as required.
Warning: Never cast effectful expression to pure. You have been warned.