Opt <val> SBinOp <Opt <val>, Opt <val>, Opt <val>, mark> .BinOp(Opt <val> l, Opt <val> r) => l.Case(r, Fst, r, (rˈ, lv) => Some(rˈ.Case(lv, Fst, lv, (lvˈ, rv) => _semi.BinOp(lvˈ, rv))));
public static type Op <type, mark>(this SSemigroup <type, mark> semi, type l, type r) => semi.BinOp(l, r);
/// <summary> /// Pair monadic join (requires left to be an additive semigrop) /// </summary> public static Pair <left, right> Flatten <left, right>(this Pair <left, Pair <left, right> > that, SSemigroup <left, Additive <Unit> > semi) => // todo resolve semi Pair(semi.BinOp(that.Left(), that.Right().Left()), that.Right().Right());