<br><font size=2 face="Courier New">The following message is in a Haskell
module. &nbsp;It will be easier to read in a fixed point font.</font>
<br>
<br><font size=2 face="Courier New">{-# OPTIONS -fglasgow-exts #-}</font>
<br>
<br><font size=2 face="Courier New">-- Hi,</font>
<br><font size=2 face="Courier New">-- </font>
<br><font size=2 face="Courier New">-- I ran into an issue while working
with functional dependencies.</font>
<br><font size=2 face="Courier New">-- Consider the following code. &nbsp;I'm
rewriting many of the prelude</font>
<br><font size=2 face="Courier New">-- operators using functional dependencies.
&nbsp;The type of he return value</font>
<br><font size=2 face="Courier New">-- is determined by the operators parameters.</font>
<br>
<br>
<br><font size=2 face="Courier New">-- Use &quot;P.&quot; in front of functions
to access the preludes version of these </font>
<br><font size=2 face="Courier New">-- functions.</font>
<br><font size=2 face="Courier New">import qualified Prelude as P </font>
<br>
<br><font size=2 face="Courier New">-- I override prelude operators with
my own operators.</font>
<br><font size=2 face="Courier New">import Prelude hiding ( (*), recip
)</font>
<br>
<br><font size=2 face="Courier New">import Ratio</font>
<br>
<br><font size=2 face="Courier New">-- recip returns the reciprocal of
its parameter. &nbsp;I've given the </font>
<br><font size=2 face="Courier New">-- Reciprocate class the ability to
return a type that is different from </font>
<br><font size=2 face="Courier New">-- its argument.</font>
<br>
<br><font size=2 face="Courier New">class Reciprocate a b | a -&gt; b where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp;recip :: a -&gt;
b</font>
<br>
<br><font size=2 face="Courier New">-- Here are some example instances
of Reciprocate. &nbsp;In most cases,</font>
<br><font size=2 face="Courier New">-- recip will return the same type
as it's argument. &nbsp;However, taking</font>
<br><font size=2 face="Courier New">-- the reciprocal of an Integer returns
a (Ratio Integer).</font>
<br>
<br><font size=2 face="Courier New">instance Reciprocate Double Double
where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp;recip = P.recip
-- I call prelude's recip here.</font>
<br>
<br><font size=2 face="Courier New">instance Reciprocate (Ratio Integer)
(Ratio Integer) where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp;recip = P.recip
-- I call prelude's recip here.</font>
<br>
<br><font size=2 face="Courier New">instance Reciprocate Integer (Ratio
Integer) where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp;recip x = (1::Integer)
% x</font>
<br>
<br>
<br>
<br><font size=2 face="Courier New">-- (*) multiplies its parameters. &nbsp;The
resulting type is determined by</font>
<br><font size=2 face="Courier New">-- the type of the arguments</font>
<br>
<br><font size=2 face="Courier New">class Multiply a b c &nbsp;| a b -&gt;
c where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (*) :: a -&gt; b -&gt;
c</font>
<br>
<br><font size=2 face="Courier New">-- Here are some example instances
of Multiply.</font>
<br>
<br><font size=2 face="Courier New">instance Multiply Double Double Double
where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (*) = (P.*)</font>
<br>
<br><font size=2 face="Courier New">-- Multiplying Integer by Double returns
a Double</font>
<br>
<br><font size=2 face="Courier New">instance Multiply Integer Double Double
where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (*) x y = (P.*) (fromIntegral
x) y</font>
<br>
<br><font size=2 face="Courier New">instance Multiply Double Integer Double
where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (*) x y = (P.*) x (fromIntegral
y)</font>
<br>
<br><font size=2 face="Courier New">instance Multiply Integer (Ratio Integer)
(Ratio Integer) where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (*) x y = (P.*) (x%1)
y</font>
<br>
<br><font size=2 face="Courier New">-- Now, this is where I ran into some
trouble I define a Divide class</font>
<br><font size=2 face="Courier New">-- as follows. &nbsp;Here I define
a default (/) operator that uses the</font>
<br><font size=2 face="Courier New">-- Reciprocate and Multiply class to
perform division. &nbsp;However, this code</font>
<br><font size=2 face="Courier New">-- produces error messages. &nbsp;So,
I commented it out. &nbsp;Even if I don't want</font>
<br><font size=2 face="Courier New">-- to implement (/) with recip and
(*), requiring this relationship --</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------------------------------------------</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; is consistent with defining</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp;_____________________________________
&nbsp; &nbsp;the divide operation in</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; terms of the multiplicative</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; inverse</font>
<br><font size=2 face="Courier New">{-</font>
<br><font size=2 face="Courier New">class (Reciprocate b recip, Multiply
a recip c) =&gt; Divide a b c | a b -&gt; c where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (/) :: a -&gt; b -&gt;
c</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (/) x y = x * (recip
y)</font>
<br><font size=2 face="Courier New">-}</font>
<br>
<br><font size=2 face="Courier New">-- This definition of (/) works. &nbsp;However,
taking the reciprocal and then </font>
<br><font size=2 face="Courier New">-- multiplying may not always be the
best way of dividing. &nbsp;So, I'd like to</font>
<br><font size=2 face="Courier New">-- put this into a divide class, so
(/) can be defined differently for</font>
<br><font size=2 face="Courier New">-- different types.</font>
<br><font size=2 face="Courier New">{-</font>
<br>
<br><font size=2 face="Courier New">(/) :: (Reciprocate b recip, Multiply
a recip c) =&gt; a -&gt; b -&gt; c</font>
<br><font size=2 face="Courier New">(/) a b = a * (recip b)</font>
<br>
<br><font size=2 face="Courier New">-}</font>
<br>
<br><font size=2 face="Courier New">-- I finally discovered that the following
definition of a Divide </font>
<br><font size=2 face="Courier New">-- class works</font>
<br><font size=2 face="Courier New">class (Reciprocate b recip_of_b, Multiply
a recip_of_b c) </font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;=&gt; Divide a b c recip_of_b | a b -&gt; c
recip_of_b where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (/) :: a -&gt; b -&gt;
c</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; (/) a b = a * (recip
b) -- Default definition can be overridden</font>
<br>
<br>
<br><font size=2 face="Courier New">-- The thing I don't like is that when
defining a new Divide class, I have</font>
<br><font size=2 face="Courier New">-- to place the reciprocal of the &quot;b&quot;
type into the class definition.</font>
<br>
<br><font size=2 face="Courier New">-- Here are some examples of Divide:</font>
<br><font size=2 face="Courier New">--</font>
<br><font size=2 face="Courier New">-- This type ----------------------------</font>
<br><font size=2 face="Courier New">-- must be the type that is &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- returned when this &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- type ------------------ &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</font>
<br><font size=2 face="Courier New">-- is passed to recip. &nbsp; | &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;|</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;v</font>
<br><font size=2 face="Courier New">instance Divide Double Double Double
Double where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp;(/) x y = (P./) x y &nbsp;--
For Doubles</font>
<br>
<br><font size=2 face="Courier New">-- Another example:</font>
<br><font size=2 face="Courier New">--</font>
<br><font size=2 face="Courier New">-- This type ------------------------------------------</font>
<br><font size=2 face="Courier New">-- must be the type that is &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; |</font>
<br><font size=2 face="Courier New">-- returned when this &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- type ------------------- &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; |</font>
<br><font size=2 face="Courier New">-- is passed to recip. &nbsp; &nbsp;|
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;v &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v</font>
<br><font size=2 face="Courier New">instance Divide Integer Integer (Ratio
Integer) (Ratio Integer) where</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp;(/) x y = x % y</font>
<br>
<br><font size=2 face="Courier New">-- The reason I don't like it is there
is enough information available to infer</font>
<br><font size=2 face="Courier New">-- the type of recip_of_b in the following
class. &nbsp;The Reciprocate class is </font>
<br><font size=2 face="Courier New">-- defined with functional dependencies,
so that recip_of_b can be determined</font>
<br><font size=2 face="Courier New">-- by the type of b.--</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; |</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; ______________________</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;|</font>
<br><font size=2 face="Courier New">--</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; class (Reciprocate
b recip_of_b, Multiply a recip_of_b c) </font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt; Divide a b c recip_of_b
| a b -&gt; c recip_of_b where</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; (/)
:: a -&gt; b -&gt; c</font>
<br><font size=2 face="Courier New">-- &nbsp; &nbsp; &nbsp; &nbsp; (/)
a b = a * (recip b)</font>
<br><font size=2 face="Courier New">--</font>
<br>
<br>
<br><font size=2 face="Courier New">-- Respecifying the recip_of_b when
I declare an instance of Divide</font>
<br><font size=2 face="Courier New">-- seem redundant. &nbsp;I'm wondering
if there is a better way to</font>
<br><font size=2 face="Courier New">-- define this. &nbsp;I also, wonder
if it would be appropriate to include</font>
<br><font size=2 face="Courier New">-- in future versions of Haskell, the
ability to infer functional</font>
<br><font size=2 face="Courier New">-- dependences in a new class definition,
so that my first attempt</font>
<br><font size=2 face="Courier New">-- at a definition of class Divide
works.</font>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>