After reading your code, I guess that the following example could be relevant:
http://ats-lang.sourceforge.net/DOCUMENT/INT2PROGINATS/HTML/HTMLTOC/x2223.html By the way, you could flatten the 'option'-values in your loop: fun {s,a:t@ype} getlast ( str : !Stream(s,a) ) : Option_vt(a) = loop(f_,s_i,0,mx) where { val mx = $UNSAFE.cast{a}(0) val Stream(s_i,f_) = str fun loop( f : !s -<cloptr1> Step (s,a), st : s, t0 : int, mx : a ) : Option_vt(a) = case f(st) of | ~Yield(st_,x_) => loop(f,st_, 1, x_) | ~Skip (st_ ) => loop(f,st_, t0, mx) | ~Done ( ) => if t0 > 0 then Some_vt(mx) else None_vt () } I was able to nearly half the execution time by doing the flattening. There is a safe way to do this. Please see some examples involving opt_none and opt_some. On Monday, January 1, 2018 at 5:19:16 PM UTC-5, M88 wrote: > > > It is unclear what you translated. Could you show? > > > I was just saying that I didn't expect the compiler to treat stream-fusion > the same way in ATS as it does in Haskell. To your point, I expected > different algorithms. > > I found the tutorial useful -- implementing a custom allocation routine > was easier than I expected it to be. I managed to get the version with > datavtypes to run as quickly as the stack version (eg, ~12ms). I need to > refine it a bit more, but that's the start I was looking for. > > I would be interested in seeing an implementation of a). I attached the > original datavtype version of the code I was using to test. This is a toy > program that creates a stream and prints the final value. > -- 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 [email protected]. To post to this group, send email to [email protected]. 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/877d68d7-df19-460a-ae8a-8b21d44265d4%40googlegroups.com.
