Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

> Could you give an example of what you mean by this?

I mean a type like `yield Nat + yield Nat ~ ()`. Here's how this would occur naturally: Define

    effect yield A is A => ()
    
    fn yield_each A, B, e : (A -> e ~ B) -> [A] -> e + yield B ~ () is
        | _, [] => ()
        \ f, [a .. as] => a->f!->yield!; as->yield_each(f)
    
    fn print_each A, B, e: (A -> e ~ B) -> e + print ~ () is
        f, l => l->yield_each(f)
            handle yield B with x => print(x->show)!
Here my_map should always behave the same as the standard map. The effect `yield B` is handled by collect, and the effect e is handled by the caller. But what happens if the effect e here is also yield?

    fn foo : print ~ [Nat] is
        [1, 2, 3]->my_map(n => yield(n)!; n+1)
         handle yield Nat with n => print("Processing " ++ n->show)!
Now yield_each effectively returns `yield Nat + yield Nat ~ ()`. Does this get combined into a single `yield Nat ~ ()`, so that the handler in print_each handles all yields?


Ah, I see what you mean. Yes, effects are always a set in terms of the final monomorphised type. This is an interesting case though, so I'll look into it further and see whether I can come up with sensible, unsurprising semantics. Thanks for pointing this out!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: