<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">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>http://people.revoledu.com/kardi/tutorial/Similarity/Normalization.html#Statistic<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></table><br>