<div dir="ltr">After working through the other problems, that fills the last remaining hole (at least for the moment).<div><br></div><div>Many thanks,</div><div><br></div><div>Sean</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 21, 2017 at 7:48 AM, Li-yao Xia <span dir="ltr"><<a href="mailto:lysxia@gmail.com" target="_blank">lysxia@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Sean,<br>
<br>
AD relies on overloading to instrument functions so they can be differentiated.<br>
<br>
f :: Num a => m1 (m2 a) -> m3 a -> a<br>
<br>
By looking at the type of "grad", one can see that f will be specialized  at type "Reverse s Double":<br>
<br>
f :: m1 (m2 (Reverse s Double)) -> m3 (Reverse s Double) -> Reverse s Double<br>
<br>
So if "x :: m1 (m2 Double)", you will need to apply "auto :: Double -> Reverse s Double" to lift x to the right type.<br>
<br>
df x theta = grad (f x') theta<br>
  where x' = (fmap . fmap) auto x<br>
<br>
Cheers,<br>
Li-yao<span class=""><br>
<br>
On 11/20/2017 05:05 PM, Sean Matthews wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
I'm having some problems with Numeric.AD (translation, things are not<br>
working for reason that I don't understand).  Note I don't have much<br>
experience with this package, so these are newbie questions, thus<br>
appropriate answers may involve pointing me to a document somewhere out<br>
there on the net.<br>
<br>
Anyway,  here is my problem:<br>
<br>
I have a function (call it f x theta) which I have defined purely in terms<br>
of basic arithmetic functions  (+/-/(/)/*/**) glued together using standard<br>
applicative functor operations has type<br>
<br>
f  :: m1 (m2 Double) -> m3 Double -> Double<br>
f x theta = ...<br>
<br>
m1 m2 and m3 are all Traversable.<br>
f is defined purely in terms of basic arithmetic operations, (+/-/(/)/*/**)<br>
glued together using standard applicative functor operations, and m1 m2 and<br>
m3 are all pretty trivial record types (no recursion, even).<br>
<br>
I would like to write<br>
<br>
df x theta = grad (f x) theta<br>
<br>
But it refuses to type, even though (admittedly quite a lot) simpler<br>
versions do.<br>
<br>
So what am I missing? Does AD not go through Applicative?  That seems<br>
unlikely to me.<br>
<br>
Any advice / suggestions, etc. gratefully received.<br>
<br>
Sean Matthews<br>
<br>
<br>
<br>
<br>
<br></span>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/haskell-caf<wbr>e</a><br>
Only members subscribed via the mailman list are allowed to post.<br>
<br>
</blockquote>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Sean Matthews<br><a href="mailto:seanmatthews1@gmail.com" target="_blank">seanmatthews1@gmail.com</a> / +49 1515 800 1901</div></div></div></div></div></div>
</div>