<div dir="ltr">Thanks Jens and Alexander<div><br></div><div>That all helps. What I'm drawing from your responses:</div><div><br></div><div>* Write Racket code work; then add types until it checks.</div><div>* exact-ceiling is a thing.</div>

<div>* Get domains right (either with types or check & error).</div><div>* Try working mainly with matrices for this problem initially.</div><div>* Write functions in terms of Real's / Nonnegative-Real's, and use Flonum data for performance.</div>

<div><br></div><div>In terms of developing a little proficiency I'll study those tests and work through one or two Octave (GNU's Matlab alternative) tutorials with TR. </div><div><br></div><div><br></div><div>Thanks!</div>

<div><br></div><div>Dan</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, May 4, 2014 at 6:10 AM, Alexander D. Knauth <span dir="ltr"><<a href="mailto:alexander@knauth.org" target="_blank">alexander@knauth.org</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>This type-checks:</div><div><div><font face="Courier New">#lang typed/racket</font></div>

<div><font face="Courier New"><br></font></div><div><font face="Courier New">(: log2 (Nonnegative-Real -> Real))</font></div><div class=""><div><font face="Courier New">(define (log2 x)</font></div><div><font face="Courier New">  (/ (log x) (log 2)))</font></div>

</div></div><div>Why don’t you just use this?  </div><br><div><div><div class="h5"><div>On May 3, 2014, at 10:09 AM, Jens Axel Søgaard <<a href="mailto:jensaxel@soegaard.net" target="_blank">jensaxel@soegaard.net</a>> wrote:</div>

<br></div></div><blockquote type="cite"><div><div class="h5">2014-05-03 8:43 GMT+02:00 Daniel Prager <<a href="mailto:daniel.a.prager@gmail.com" target="_blank">daniel.a.prager@gmail.com</a>>:<br><blockquote type="cite">

I'm having a go at converting a pitch detection algorithm from MATLAB to<br>Typed Racket, and which I'll Open Source if I can get it working, and am<br>after a few pointers, since I'm new to TR and am finding it slow going.<br>

<br>Examples of the kind of code I'm writing in my fledlging attempts:<br><br>#lang typed/racket<br><br>(define: (log2 [x : Real]) : Real<br>  (define result (/ (log x) (log 2)))<br>  (if (real? result)<br>      result<br>

      0.0))<br></blockquote><br>My strategy is write the write the function in normal Racket first:<br><br>  (define (log2 x)<br>      (/ (log x) (log 2)))<br><br>Then to add the type:<br><br>  (: log2 : Real -> Real)<br>

  (define (log2 x)<br>      (/ (log x) (log 2)))<br><br>In this case I get a type error, the result is not a Real but a Number.<br>If x is negative, then (log x) is a complex number. I therefore need<br>to insert a an explicit check that x is positive:<br>

<br>(: log2 : Real -> Real)<br>(define (log2 x)<br>    (cond [(positive? x) (/ (log x) (log 2))]<br>              [else             (error 'log2 "positive number expected")]))<br><br>This version type checks.<br>

<br><blockquote type="cite">(define: (build-step-vector [min : Real] [step : Real] [max : Real]) :<br>  (Vectorof Real)<br>  (for/vector: : (Vectorof Real)<br>      #:length (ceiling (inexact->exact (/ (- max min) step)))<br>

      ([i (in-naturals)])<br>    (+ min (* i step))))<br></blockquote><br>Here I tried this version:<br><br>(: step-vector : Real Real Real -> (Vectorof Real))<br>(define (step-vector min max step)<br>  (for/vector #:length (exact-ceiling (/ (- max min) step))<br>

    ([x (in-range min max step)])<br>    x))<br><br>This gave an error, since TR could only infer that the result was a<br>(Vectorof Any).<br>Then I changed it to:<br><br>(: step-vector : Real Real Real -> (Vectorof Real))<br>

(define (step-vector min max step)<br>  (for/vector: : (Vectorof Real) #:length (exact-ceiling (/ (- max min) step))<br>    ([x (in-range min max step)])<br>    x))<br><br><blockquote type="cite">Beyond that:<br><br>Can anyone point me to examples of any code before/after converted from<br>

MATLAB (or Octave) to TR?<br></blockquote><br>I haven't any experience with either (except reading parts of the<br>documentation).<br>Do you have any particular examples in mind?<br><br><blockquote type="cite">What's a good scalar type to work with for floating point to start with?<br>

</blockquote><br>Flonum ?<br><br><blockquote type="cite">Which non-scalar type(s) should I favor: vectors, arrays or matrices?<br></blockquote><br>Matrices are just two-dimensional arrays. Therefore if there is a matrix<br>

operation missing, mostly likely you can find it in the array section<br>of the documentation.<br><br>If you stick with matrices, you can view vectors as nx1 matrices.<br>This allows you to use the matrix operations on vectors.<br>

<br>Depending on the operations you need, I'd try out matrices.<br><br><blockquote type="cite">Any general tips to develop facility for this kind of stuff? I feel like I<br>need to go "back to basics", but there seems to be a dearth of examples and<br>

tutorials. on math/... beyond the reference materials.<br></blockquote><br>True.<br><br>/Jens Axel<br></div></div><div class="">____________________<br>  Racket Users list:<br>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>

</div></blockquote></div><br></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><div style="font-family:arial;font-size:small"><b>Daniel Prager</b></div><div style="font-family:arial;font-size:small">

Agile/Lean Coaching, Software Development and Leadership<br></div><div style="font-family:arial;font-size:small"><font color="#999999">Startup: </font><font color="#000000"><a href="http://www.youpatch.com" target="_blank">www.youpatch.com</a></font></div>

<div style="font-family:arial;font-size:small"><font color="#999999">Twitter:</font> <a href="https://twitter.com/agilejitsu" style="color:rgb(17,85,204)" target="_blank">@agilejitsu</a> </div><div style="font-family:arial;font-size:small">

<font color="#999999">Blog:</font> <a href="http://agile-jitsu.blogspot.com/" style="color:rgb(17,85,204)" target="_blank">agile-jitsu.blogspot.com</a></div></div>
</div>