Hi Richard - thanks for the instructive examples; I clarified a related 
point on the wiki. 


On Wednesday, May 29, 2019 at 9:12:07 PM UTC-4, Richard wrote:
>
>
> #include "share/atspre_staload.hats"
>
> implement main0() = ()
>
> // If I am not mistaken, all functions in ats have all effects (i.e. :<1>) 
> by default.
> // note, :<0> is equivalent to :<>
>
> // Just some thoughts....
>
> fun terminating .<>. (n: int):<> int = n * n
>
> //
> // Here we require to provide proof that the function terminates
> // so, we just insist that it does (.<>.)
> //
> // Well it does not seem to be a very effectful function so sure
> // though, what is the significance of purity in this case?
> //
> // Effects tracking in ats is not exactly a contract
> // For example,
>
> val terminate = terminating(0xb505)
>
> //
> // This typechecks fine however, do you notice something strange about the 
> resulting value?
> // Passing a value larger than the square root of INTMAX causes arithmetic 
> overflow...
> //
> // In this case, what good is a function annotated as pure if it can 
> produce arithmetic overflow?
> //
> // Let us look at a different example, lets use dependent types to flush 
> out this potential bug...
> //
>
> stadef IMAX = 2147483647
>
> fun dependent {n:int | n*n <= IMAX} (n: int(n)): int(n*n) = n*n
>
> // 'depend' below fails typechecking,
> // unsolved constraint:
> // (46341 * 46341) <= IMAX
> val depend = dependent(0xb505)
>
>
> // however this typechecks,
> val depend = dependent(0xb504)
>
>
>
>
> On Wednesday, May 29, 2019 at 1:14:19 PM UTC-4, Brandon Barker wrote:
>>
>> Hi Guys,  Thanks for the discussion.
>>
>> As usual I don't fully understand or recall some of the relevant issues.
>>
>> In the online editor I quickly tried out this:
>>
>> fun double (n: int) :<1> int = n + n
>>
>> val () = println! ("double(5) = ", double(5))
>>
>>
>> Which works. But changing :<1> to :<0> fails to compile; i also tried a 
>> non-polymorphic identity function for ints and had the same result. So what 
>> does :<0> really mean?
>>
>> I think if we had (1), a way to keep track of purity, i.e., any 
>> expressions returning unit must be equivalent to the expression () 
>> (hopefully this isn't hard to check..), and (2), a way to tell the compiler 
>> to assume that ":" assumes :<0> by default, then we might just get purity 
>> checking done for free.
>>
>
> I think that requiring all functions to be pure in the current 
> implementation of ats2 would produce an environment that would greatly 
> decrease programming productivity :)
>  
>

I agree, that in its current definition, "pure" is actually stronger than 
what I had in mind. I think letting the programmer choose the default 
effect type of functions could be useful when executing a build (though it 
would also have to take this into account, ideally, when linking with other 
ATS libraries).  

I was going to see if I could get what I wanted, starting by doing this, 
and playing around with eliminating effects that don't jive with my notion 
of "sort of pure" ;-):

implement
main0 () = {
 val () = println! ("double(5) = ", double(5))
}

fun double .<>. (n: int) :<0> int = (
  // print 'h';
  n + n
)



 Unfortunately, this resulted in an error that I don't have time to dive 
into tonight (was using version 0.3.11 out of convenience). Online, it 
works (see attached image). However, if I uncomment the print 'h' line, it 
fails, but i can't see the error online.



-- 
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/9b7facd2-db6d-4c90-b6b8-ba34bba7cb5d%40googlegroups.com.

Reply via email to