Re: Proposal: add replay function to Control.Monad.Cont.Class

Alexandre Esteves <[email protected]>
Newsgroups gmane.comp.lang.haskell.libraries
Message-ID <CAFgV2eZrrfi4zyOjZhEAWiyOeEEVKx8Vs2OH6HQtTq7JHJQ68g@mail.gmail.com>
Agreed that 'label' is a better name than goto/replay.
It didn't even hit me until I saw setJump that `m (m a)` doesn't allow
representing recursive functions with arguments, so `a -> m(a -> m b, a)`
does seem much more expressive to me
Starting with my original examples, introducing the recursive binding when
there are arguments would look like

`(numberPromptStep, (x,y)) <- setJump (x0, y0)`
`fix $ \numberPromptStep x y -> do`
`numberPromptStep x y = do`

It is slightly annoying that the later 2 can simply add an argument while
setJump requires using the uncurried version but I don't see a way around
that since >>= itself works that way
`m (m a)` is essentially the 0-tuple version of `a -> m(a -> m b, a)` which
makes me wonder if it's even worth having. Sure, it's convenient not to
have these unit/() around, but maybe the same argument (heh) could be made
for 2-argument and 3-argument versions.

do
  numberPromptStep <- setJump
  (..)
  numberPromptStep
do
  (numberPromptStep, x, y) <- setJump2 x0 y0
  (..)
  numberPromptStep x' y'

Given that, I think `a -> m (a -> m b, a)` is the important one be it
called label or setJump and maybe there can be a specialized 0-tuple
version (e.g. label_ / setJump_) offering the `m (m a)` special case. I
don't feel strongly about it though, since unlike `for_` it wouldn't
actually relax constraints, only have a simpler signature.



On Sun, Mar 7, 2021 at 7:33 PM David Feuer <[email protected]> wrote:

> Why not both?
>
> On Sun, Mar 7, 2021, 1:36 PM Zemyla <[email protected]> wrote:
>
>> I kind of don't like it, because the continuation doesn't return anything
>> but itself. I'd prefer something that works more like the setjmp function
>> in C, taking a value and returning the value plus a function that lets it
>> return the new value:
>>
>> setJump :: MonadCont m => a -> m (a -> m b, a)
>> setJump a = callCC $ \k -> let
>>   go b = k (go, b)
>>   in pure (go, a)
>>
>> On Sun, Mar 7, 2021, 11:36 Carter Schonwald <[email protected]>
>> wrote:
>>
>>> Yeah
>>>
>>> On Sun, Mar 7, 2021 at 12:16 PM Edward Kmett <[email protected]> wrote:
>>>
>>>> I rather like label. +1 from me.
>>>>
>>>> On Sun, Mar 7, 2021 at 1:25 AM Tom Ellis <
>>>> [email protected]> wrote:
>>>>
>>>>> On Sun, Mar 07, 2021 at 03:25:16AM +0000, Alexandre Esteves wrote:
>>>>> > replay :: MonadCont m => m (m a)
>>>>> > replay = callCC $ pure . fix
>>>>> >
>>>>> > Using this in a do-notation block allows one to bind a name to the
>>>>> > sub-block that starts immediately after.
>>>>> > I reached for continuations to try to get this behavior for use with
>>>>> > recursive flows without disrupting the reading of the main forward
>>>>> flow and
>>>>> > found how to do it in https://jsdw.me/posts/haskell-cont-monad/
>>>>> under the
>>>>> > name "goto".
>>>>> >
>>>>> > While "goto" is as familiar as a name can be, I feel "replay" more
>>>>> > accurately conveys, that you can only 'go back', by stating what
>>>>> actually
>>>>> > is happening - that a sub-block we're currently evaluating is
>>>>> replayed from
>>>>> > its beginning.
>>>>>
>>>>> Looks like a "label" more than a "goto" to me.  Would "label" be a
>>>>> good name?
>>>>> _______________________________________________
>>>>> Libraries mailing list
>>>>> [email protected]
>>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>>>
>>>> _______________________________________________
>>>> Libraries mailing list
>>>> [email protected]
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>>
>>> _______________________________________________
>>> Libraries mailing list
>>> [email protected]
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>
>> _______________________________________________
>> Libraries mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>
> _______________________________________________
> Libraries mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>

_______________________________________________
Libraries mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.