<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#ffffff">
<br>
Michael,<br>
<br>
just leaving out the type declaration for 'normalize', your module
complies fine and ghc infers the following type:<br>
<br>
normalize :: (Integral a, Floating a) =&gt; [a] -&gt; a -&gt; a<br>
<br>
Note that the context (Integral a, Floating a) cannot be met by any of
the standard types. (try in ghci: ":i Integral" and ":i Floating")<br>
So we have to apply a conversion function like this: (I just replaced
len by len' at all occurrences)<br>
<br>
&gt; normalize l = let (total,len) = sumlen l<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len' = fromIntegral len<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg = total/len'<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdev = sqrt $ ((/) (len'-1)) $ sum $ map ((**
2.0) . (subtract avg)) l<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp; ((/) stdev) . (subtract avg)<br>
<br>
yielding a type of<br>
<br>
normalize :: (Floating b) =&gt; [b] -&gt; b -&gt; b<br>
<br>
You could save the conversion by allowing a more liberal type for
'sumlen'. Without the type signature, it is inferred to<br>
<br>
sumlen :: (Num t, Num t1) =&gt; [t] -&gt; (t, t1)<br>
<br>
-- Steffen<br>
<br>
On 01/31/2011 06:29 PM, michael rice wrote:
<blockquote cite="mid:915710.97971.qm@web31103.mail.mud.yahoo.com"
 type="cite">
  <table border="0" cellpadding="0" cellspacing="0">
    <tbody>
      <tr>
        <td
 style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none;"
 valign="top">I'm mapping a function over a list of data, where the
mapping function is<br>
determined from the data.<br>
        <br>
g f l = map (g l) l<br>
        <br>
So<br>
        <br>
g serialize "prolog"&nbsp; -&gt;&nbsp; [4,5,3,2,3,1]<br>
        <br>
But I'm having typing problems trying to do a similar thing with a
function<br>
that statistically normalizes data.<br>
        <br>
See:<br>
<a class="moz-txt-link-freetext" href="http://people.revoledu.com/kardi/tutorial/Similarity/Normalization.html#Statistic">http://people.revoledu.com/kardi/tutorial/Similarity/Normalization.html#Statistic</a><br>
        <br>
So<br>
        <br>
g normalize [2,5,3,2]&nbsp; -&gt;&nbsp;
[-0.7071067811865475,1.414213562373095,0.0,-0.7071067811865475]<br>
        <br>
Is my typing for normalize too loose. Should I be using Floating rather
than Num?<br>
        <br>
Michael<br>
        <br>
=======Code==============<br>
{-<br>
See Problem 42, pg. 63, Prolog by Example, Coelho &amp; Cotta<br>
        <br>
Generate a list of serial numbers for the items of a given list,<br>
the members of which are to be numbered in alphabetical order.<br>
        <br>
*Main&gt; serialize "prolog"<br>
[4,5,3,2,3,1]<br>
*Main&gt; serialize "int.artificial"<br>
[5,7,9,1,2,8,9,5,4,5,3,5,2,6]<br>
        <br>
*Main&gt; ["prolog"] &gt;&gt;= serialize<br>
[4,5,3,2,3,1]<br>
*Main&gt; ["int.artificial"] &gt;&gt;= serialize<br>
[5,7,9,1,2,8,9,5,4,5,3,5,2,6]<br>
-}<br>
        <br>
import Data.Map hiding (map)<br>
import Data.List<br>
        <br>
{-<br>
serialize :: [Char] -&gt; [Int]<br>
serialize l = map (f l) l <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f = ((!) . fromList . ((flip zip) [1..]) . (sort . nub))<br>
-}<br>
        <br>
serialize :: (Ord a, Integral b) =&gt; [a] -&gt; a -&gt; b<br>
serialize = ((!) . fromList . ((flip zip) [1..]) . (sort . nub))<br>
        <br>
g f l = map (f l) l<br>
        <br>
normalize :: (Num a, Num b) =&gt; [a] -&gt; a -&gt; b<br>
normalize l = let (total,len) = sumlen l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg = total/len<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdev = sqrt $ ((/) (len-1)) $ sum $ map ((** 2.0) .
(subtract avg)) l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in&nbsp; ((/) stdev) . (subtract avg) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>
sumlen :: (Num a, Integral b) =&gt; [a] -&gt; (a,b)<br>
sumlen l = sumlen' l 0 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where sumlen' [] sum len = (sum,len)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumlen' (h:t) sum len = sumlen' t (sum+h) (len+1)<br>
=========================<br>
        <br>
Prelude&gt; :r<br>
[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( serialize2.hs, interpreted )<br>
        <br>
serialize2.hs:34:32:<br>
&nbsp;&nbsp;&nbsp; Could not deduce (Integral a) from the context (Num a, Num b)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from a use of `sumlen' at serialize2.hs:34:32-39<br>
&nbsp;&nbsp;&nbsp; Possible fix:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add (Integral a) to the context of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the type signature for `normalize'<br>
&nbsp;&nbsp;&nbsp; In the expression: sumlen l<br>
&nbsp;&nbsp;&nbsp; In a pattern binding: (total, len) = sumlen l<br>
&nbsp;&nbsp;&nbsp; In the expression:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (total, len) = sumlen l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg = total / len<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdev = sqrt<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $&nbsp;&nbsp; ((/) (len - 1)) $ sum $ map ((** 2.0) . (subtract
avg)) l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (/ stdev) . (subtract avg)<br>
        <br>
serialize2.hs:36:61:<br>
&nbsp;&nbsp;&nbsp; Could not deduce (Floating a) from the context (Num a, Num b)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arising from a use of `**' at serialize2.hs:36:61-66<br>
&nbsp;&nbsp;&nbsp; Possible fix:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add (Floating a) to the context of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the type signature for `normalize'<br>
&nbsp;&nbsp;&nbsp; In the first argument of `(.)', namely `(** 2.0)'<br>
&nbsp;&nbsp;&nbsp; In the first argument of `map', namely<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `((** 2.0) . (subtract avg))'<br>
&nbsp;&nbsp;&nbsp; In the second argument of `($)', namely<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `map ((** 2.0) . (subtract avg)) l'<br>
        <br>
serialize2.hs:37:18:<br>
&nbsp;&nbsp;&nbsp; Couldn't match expected type `b' against inferred type `a'<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `b' is a rigid type variable bound by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the type signature for `normalize' at serialize2.hs:33:25<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `a' is a rigid type variable bound by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the type signature for `normalize' at serialize2.hs:33:18<br>
&nbsp;&nbsp;&nbsp; In the expression: (/ stdev) . (subtract avg)<br>
&nbsp;&nbsp;&nbsp; In the expression:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (total, len) = sumlen l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg = total / len<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stdev = sqrt<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $&nbsp;&nbsp; ((/) (len - 1)) $ sum $ map ((** 2.0) . (subtract
avg)) l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (/ stdev) . (subtract avg)<br>
&nbsp;&nbsp;&nbsp; In the definition of `normalize':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normalize l = let<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (total, len) = sumlen l<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg = total / len<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in (/ stdev) . (subtract avg)<br>
Failed, modules loaded: none.<br>
        <br>
        </td>
      </tr>
    </tbody>
  </table>
  <br>
  <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
Haskell-Cafe mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a>
<a class="moz-txt-link-freetext" href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a>
  </pre>
</blockquote>
<br>
</body>
</html>