Hi Brandon,

On Friday, March 22, 2019 at 8:49:29 PM UTC+2, Brandon Barker wrote:
>
> Hey Artyom,
>
> Thanks for the very interesting analysis and response.
>
>
Glad you found it useful!

On Fri, Mar 22, 2019 at 4:06 AM Artyom Shalkhakov <artyom.s...@gmail.com 
> <javascript:>> wrote:
>
>> Hi Brandon,
>>
>> This is a very lively discussion, thanks for bringing it up.
>>
>> On Friday, March 22, 2019 at 5:48:07 AM UTC+2, Brandon Barker wrote:
>>>
>>> And for what it's worth, here is an Idris program for haha using Effects:
>>>
>>> module Main
>>>
>>>
>>> import Effects
>>> import Effect.StdIO
>>>
>>>
>>> hello : Eff () [STDIO]
>>> hello = let ha = StdIO.putStr "ha" in ha *> ha
>>>
>>>
>>> main : IO ()
>>> main = run hello
>>>
>>>
>>>
>>> It prints "ha" twice, despite being a strict language. I presume, but am 
>>> not sure, this is because the effect time requires it to be re-evaluated 
>>> each time.
>>>
>>>
>>>
>> Well, the type of "hello" says that the computation will use the STDIO 
>> effect as many times as is necessary. The way the computation is 
>> constructed, it is meant to issue commands in a given sequence.
>>
>> One peculiarity of PureScript is that of handling effects via the 
>> algebraic effects approach. It's not easy to do in a high-performance way, 
>> because you need a call/cc construct present in the language, and moreover 
>> a 'multi-shot' one at that (i.e. the continuation *may* be invoked zero, 
>> once or more times by the effect interpreter). In ATS a simpler way is to 
>> use template functions to define effects differently (e.g. during testing 
>> and during the actual execution) -- it's constrained compared to the 
>> call/cc for sure, but then you don't have to pay the price of the call/cc 
>> plumbing. Another thing about PureScript is that it uses row types to track 
>> the set of effects that a given Eff computation may involve during its 
>> evaluation.
>>
>
> Not that it will invalidate anything you just said, but the above code was 
> Idris, but they may be similar in this regard (not sure). I need to look 
> into call/cc more at some point - not very familiar with this idea. But I 
> like where you are going with templates in ATS!
>


Haha, right! I mixed them up. I do remember reading about effects in both 
languages! And I think they are pretty similar, except in Idris, you have a 
type-level list of effects, whereas in PureScript, it is instead a row of 
effects. So, pretty similar from the POV of using it. I think. :)
 

>
>> So in short, if we view the programs as creating commands, and then some 
>> kind of external interpreter that executes them, then it all matches up. 
>> The programs might be quite pure and non-side-effecting (except for 
>> non-termination aka infinite looping runtime exceptions), the interpreter 
>> will perform the effects. Here's a pseudocode for the interpreter:
>>
>> // the command sub-language
>> datatype Command = Print of string | Nop | Seq of (command, command)
>> extern
>> fun runCommand (c:Command): void
>> extern
>> fun seq (c:Command, Command): Command
>> extern
>> fun cprint (s:string): Command
>> implement
>> seq (c1, c2) = Seq (c1, c2)
>> implement
>> cprint (s) = Print s
>> // the interpreter itself
>> implement
>> runCommand (c) = case+ c of Nop => (*done!*) | Print s => print (s) | Seq 
>> (c1, c2) => (runCommand(c1); runCommand(c2))
>>
>> Now let's assume the Command is abstract for the rest of the program (and 
>> only the runCommand, seq and print are exposed). We can now write:
>>
>> val hello = let val h = cprint "hi" in seq (h, h) end // here. twice the 
>> effect!
>> implement
>> main0 () = runCommand hello
>>
>> The "hello" itself is free of side-effects (or so it seems to me!). We 
>> might need to lazily evaluate stuff here (e.g. to enable looping, where you 
>> need to give the interpreter the chance to run side-by-side with your 
>> expression). Or we need a more poweful "seq" (i.e. the Haskell's "bind" 
>> operator for stitching together the commands such that the left-hand side 
>> has to be evaluated to a value that is then fed to the right-hand side -- 
>> i.e. incrementally built-up as it's being evaluated by the interpeter).
>>
>> In Haskell, the type Command is termed "IO" (with an additional type 
>> parameter to signify the result type of the command) and the interpreter is 
>> somewhere in the runtime system.
>>
>
> Nice to see that the basis of an interpreter can be created so easily! I 
> guess to make it feasible to program in, in addition to the issues you just 
> mentioned, some primitive standard library functions would need to be 
> wrapped up as 'Command' functions just as you did with cprint; another way 
> to do this might be to ascribe certain effect types to these primitives 
> using e.g praxi. Functions that build on these primitives could then 
> accumulate effects - perhaps some effects could even be consumed, but not 
> sure. Also not sure how the interpreter would deal with some values have 
> more than one effect type: Haskell seems to use the idea of monad 
> transformers to get around this but I do not find it particularly 
> satisfying so far 
>

In Haskell there exists special support for the IO monad in the runtime and 
in the compiler; without such support I don't think it will be feasible to 
program in this way (since we will have to pay the price for the 
construction of terms even in the simplest of cases!).
 
>
> Still need to look into effects and how to encode different effect types - 
> I seem to recall ATS actually had build in support for effects at the type 
> level at some point.
>

Well, in my post I was talking mostly about algebraic effect handlers, and 
in ATS we have effect types. The former I'm interested in mostly because of 
modular testing. The latter, I think, is used mostly for tracking the 
dynamic terms that can be safely erased from the program with no change to 
said program's behavior.
  

> Do you have or plan on having a repo to play around with this idea? If not 
> I may try to start one (at some point).
>

Well, I'll post it as a gist on github. I think there does exist a 
connection between the algebraic effect handlers and function templates 
that I would like to pursue, but I'm short on time.
 

>  
>
>>  
>>
>>> On Thursday, March 21, 2019 at 11:33:35 PM UTC-4, Brandon Barker wrote:
>>>>
>>>>
>>>>
>>>> On Thu, Mar 21, 2019 at 8:18 PM gmhwxi <gmh...@gmail.com> wrote:
>>>>
>>>>>
>>>>> One can definitely build a monad-based library to support IO:
>>>>>
>>>>> absvtype IO(a:vt@ype) = ptr
>>>>>
>>>>
>>>>
>>>> If really using monads, would it also be reasonable to do (or ideally 
>>>> start at Functor and then build up to Monad):
>>>>   
>>>> absvtype Monad(a:vt@ype) = ptr
>>>>  
>>>> somewhat as discussed at 
>>>> https://groups.google.com/forum/m/#!msg/ats-lang-users/gLiMU29C77c/sIjtqzmCBAAJ
>>>>
>>>>
>>>>> The problem with IO monad is that it is so broad. With linear types,
>>>>> a programmer can specify a lot more precisely.
>>>>>
>>>>> I agree. But my limited and slowly changing experience suggests that 
>>>> IO is a good starting point to help ensure purity in the rest of the code 
>>>> that doesn't have effects; IO can typically be refined later to different 
>>>> types of Effects, I suppose.
>>>>  
>>>>
>>>>> >>is that ATS doesn't (by default?) model an IO effect.
>>>>>
>>>>> No, it doesn't if you use the default library. But nothing prevents you
>>>>> from tracking IO effects in ATS.
>>>>>
>>>>
>>>> So in this case, one would create an alternative 'main' that must be 
>>>> composed of IO values. But what is to stop somewhat from calling print in 
>>>> a 
>>>> function returning an IO, for instance? Thus violating the IO contract.
>>>>  
>>>>
>>>>>
>>>>> In the book you mentioned in your message, I was really thinking of
>>>>> views for specifying memory layouts. With linear views, a programmer
>>>>> can be very precise in describing what memory a function can 
>>>>> access/update.
>>>>> Compared to state monads, this kind of precision is unmatched.
>>>>>
>>>>
>>>> Agreed. Maybe a separate effect type for STDIO, STDIN, etc would be a 
>>>> better starting point. Even in Haskell, I've seen some authors frown on 
>>>> State since it is, in their view, a bit dishonest and not much better htan 
>>>> IO (or maybe not better at all; see "false purity" at 
>>>> https://www.fpcomplete.com/blog/2017/06/readert-design-pattern).
>>>>  
>>>>
>>>>>
>>>>> On Thursday, March 21, 2019 at 1:28:42 PM UTC-4, Brandon Barker wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thursday, March 21, 2019 at 9:30:40 AM UTC-4, Brandon Barker wrote:
>>>>>>>
>>>>>>> Hi Artyom,
>>>>>>>
>>>>>>> I'm also grappling with the issue of RT in this case as I'd so far 
>>>>>>> only thought about it in terms of function calls, but what you and 
>>>>>>> Vanessa 
>>>>>>> say helped me to understand the issue. Though I haven't managed to get 
>>>>>>> ATS 
>>>>>>> to have the same behavior as OCaml in the "let expression" above, I 
>>>>>>> suspect 
>>>>>>> it is possible. The key phrase here seems to be "side-effecting 
>>>>>>> expression", and relates to the fact that functions in ATS can perform 
>>>>>>> side 
>>>>>>> effects without having any effect type or IO monad ascribed to the 
>>>>>>> value 
>>>>>>> (again, iirc).
>>>>>>>
>>>>>>
>>>>>> Well, maybe that isn't the real key - the real key, I now think, is 
>>>>>> that ATS doesn't (by default?) model an IO effect. In section 6.9 of 
>>>>>> http://ats-lang.sourceforge.net/DOCUMENT/INT2PROGINATS/PDF/main.pdf 
>>>>>> it is mentioned that using both linear and dependent types may be used 
>>>>>> to 
>>>>>> do this, though I think the suggestion here is for more than printing to 
>>>>>> e.g. STDOUT. 
>>>>>>
>>>>>> If anyone has looked at modeling/enforcing an IO-like effect type in 
>>>>>> ATS, I'd be interested to see it.
>>>>>>
>>>>>>>
>>>>>>> Perhaps tonight I should try out the same in Idris or PureScript, 
>>>>>>> which are not lazily evaluated by default but do use IO, to get a 
>>>>>>> better 
>>>>>>> understanding.
>>>>>>>
>>>>>>> On Thursday, March 21, 2019 at 3:17:46 AM UTC-4, Artyom Shalkhakov 
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> Hi Brandon,
>>>>>>>>
>>>>>>>> Admittedly I don't really understand what RT is, but from what I 
>>>>>>>> understand, in Haskell the expression like [print "ha"] is basically a 
>>>>>>>> command to the top-level interpreter (which is the language runtime) 
>>>>>>>> to 
>>>>>>>> perform an effect on the console (moreover, it will be evaluated on 
>>>>>>>> as-needed basis). Moreover, the ";" is itself another comand, the 
>>>>>>>> explicit 
>>>>>>>> sequencing command, the meaning of which is "perform the left-hand 
>>>>>>>> side 
>>>>>>>> effects, then perform the right-hand side effects". Such a command is 
>>>>>>>> a 
>>>>>>>> value, so it can be passed as a value and reused as many times as is 
>>>>>>>> necessary. In ATS, the expression like [print "ha"] evaluates right 
>>>>>>>> there 
>>>>>>>> to a void/"no value", and the ";" is also NOT a value at all, but 
>>>>>>>> rather a 
>>>>>>>> "shortcut" syntax to a "let-in-end" form.
>>>>>>>>
>>>>>>>> I like to imagine an interpreter that sits in the Haskell's 
>>>>>>>> runtime. Values of IO type are commands to this interpreter. Typical 
>>>>>>>> Haskell IO-based programs are building up these commands as they are 
>>>>>>>> being 
>>>>>>>> evaluated by the runtime. The runtime starts evaluation at the "main" 
>>>>>>>> expression defined by the programmer.
>>>>>>>>
>>>>>>>> чт, 21 мар. 2019 г. в 03:45, Brandon Barker <brandon...@gmail.com>:
>>>>>>>>
>>>>>>>>> I'm a little rusty, so can't come up with many good examples.
>>>>>>>>>
>>>>>>>>> Apparently it is possible to do something like this in OCaml:
>>>>>>>>>
>>>>>>>>> implement
>>>>>>>>> main0 () = {
>>>>>>>>>   val () = let
>>>>>>>>>     val ha = print("ha")
>>>>>>>>>   in
>>>>>>>>>     (ha; ha) // How to get two ha's here?
>>>>>>>>>   end
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> After running the program, you would only see one "ha", which 
>>>>>>>>> violates RT.
>>>>>>>>>
>>>>>>>>> However, ATS doesn't seem to allow a sequence expression in the 
>>>>>>>>> "in" position of a let expression, as this doesn't compile. 
>>>>>>>>> Admittedly I'm 
>>>>>>>>> just trying to see if ATS2 doesn't have RT in this particular case, 
>>>>>>>>> but it 
>>>>>>>>> would also be good to know about the sequence expressions here.
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>>> Groups "ats-lang-users" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>>> send an email to ats-lang-user...@googlegroups.com.
>>>>>>>>> To post to this group, send email to ats-lan...@googlegroups.com.
>>>>>>>>> Visit this group at https://groups.google.com/group/ats-lang-users
>>>>>>>>> .
>>>>>>>>> To view this discussion on the web visit 
>>>>>>>>> https://groups.google.com/d/msgid/ats-lang-users/5eba6b86-4146-4ba2-a87f-f8c511d902f0%40googlegroups.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/5eba6b86-4146-4ba2-a87f-f8c511d902f0%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> Cheers,
>>>>>>>> Artyom Shalkhakov
>>>>>>>>
>>>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "ats-lang-users" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to ats-lang-user...@googlegroups.com.
>>>>> To post to this group, send email to ats-lan...@googlegroups.com.
>>>>> Visit this group at https://groups.google.com/group/ats-lang-users.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/ats-lang-users/3d13aac1-2f28-47af-afbd-6d9eced901db%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/ats-lang-users/3d13aac1-2f28-47af-afbd-6d9eced901db%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>>>
>>>> -- 
>>>> Brandon Barker
>>>> brandon...@gmail.com
>>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "ats-lang-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to ats-lang-user...@googlegroups.com <javascript:>.
>> To post to this group, send email to ats-lan...@googlegroups.com 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/ats-lang-users.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/ats-lang-users/9ff2fb00-6790-4541-9bc0-0a949a0c46e3%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/ats-lang-users/9ff2fb00-6790-4541-9bc0-0a949a0c46e3%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
> Brandon Barker
> brandon...@gmail.com <javascript:>
>

-- 
You received this message because you are subscribed to the Google Groups 
"ats-lang-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ats-lang-users+unsubscr...@googlegroups.com.
To post to this group, send email to ats-lang-users@googlegroups.com.
Visit this group at https://groups.google.com/group/ats-lang-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ats-lang-users/2433f94b-12ba-4829-9ff9-f958206721b0%40googlegroups.com.

Reply via email to