Re: Rosetta code added in OCaml, please check

"Gabriel Scherer [email protected] [ocaml_beginners]" <[email protected]> Tue, 27 Dec 2016 11:00:23 -0500
Newsgroups gmane.comp.lang.ocaml.beginners
Message-ID <CAPFanBG9WQXGWT7wc1tNejUt_VgAdwekTHJr1EccC7F-JGO6tg@mail.gmail.com>
--001a11378bb495e7fd0544a5f57c
Content-Type: text/plain; charset=UTF-8

Hi Manfred,

Thanks for the interesting question. Having your code reviewed is an
excellent way to make progress.

For history variables, your code is fine, but you should consider using the
Stack module instead of re-implementing yourself using mutable lists.
(Independently, when you have a record with a single mutable field, you
could consider using the standard "ref" type instead; but sometimes having
your own record type actually helps readability.)

For the enumeration of ordinal numbers, there are two things that I am not
fond of in your code:

1. I think that "when" is a dangerous construction to use and its use
should be de-emphasized, because it encourages code that relies on ordering
in non-trivial way, diminishing a lot of the value of pattern-matching. The
fact that, apart from the "when" clause, you are not using expressive
patterns in any way is the sign of a code smell in my book. When I teach
beginners, I ask them to only pattern-match on algebraic datatypes. I would
encourage you to rewrite this part with an explicit "if ... else if ..."
cascade.

You could also decide to factorize the three cases with a function

  let non_th n =
    let d = n mod 10 in
    d >= 1 && d <= 3 && n mod 100 <> (10 + d) in

2. The creation of the array in "f" seems unnecessary to me. Using a "for"
loop would result in simpler code, whose structure would be more directly
apparent to readers.

(If you like functional pipelines with higher-order iterator, you may be
pleased by the following reformulation of your code, that I think is still
not as good as a for loop:

  Array.init ...
  |> Array.iter ...
  |> print_newline
)

In languages with powerful features, I think it is good to keep a principle
of local simplicity: use the simplest feature that lets you express the
problem without undue redundancy. (This rule of thumb is in tension with
the other rules that the parts of a given block of code should be at
roughly the same abstraction level: if you need to do X, Y, Z in sequence,
and only Y can be expressed simply with a for-loop, it's better to keep a
homogeneous style.)

Cheers

On Tue, Dec 27, 2016 at 10:40 AM, Manfred Lotz [email protected]
[ocaml_beginners] <[email protected]> wrote:

> Hi there,
> I have added OCaml solutions for two simple tasks at Rosettacode.
>
> As a mere beginner in OCaml I don't want to add bad quality stuff at
> Rosettacode, and thus (worst case) in the end make people believe
> OCaml were a bad language.
>
> Therefore, I would be happy if some of the more knowledgeable people
> around here could check if the code I added is OK.
>
> http://rosettacode.org/wiki/History_variables#OCaml
> http://rosettacode.org/wiki/N%27th#OCaml
>
>
> Thanks a lot.
>
> Manfred
>
>
> ------------------------------------
> Posted by: Manfred Lotz <[email protected]>
> ------------------------------------
>
> Archives up to December 31, 2011 are also downloadable at
> http://www.connettivo.net/cntprojects/ocaml_beginners
> The archives of the very official ocaml list (the seniors' one) can be
> found at http://caml.inria.fr
> Attachments are banned and you're asked to be polite, avoid flames etc.
> ------------------------------------
>
> Yahoo Groups Links
>
>
>
>

--001a11378bb495e7fd0544a5f57c
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm=
l4/strict.dtd">
<html>
<head>
</head>






=20
<body style=3D"background-color: #fff;">
<span style=3D"display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id=3D"ygrp-mlmsg" style=3D"position:relative;">
  <div id=3D"ygrp-msg" style=3D"z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id=3D"ygrp-text" >
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p><div dir=3D"ltr"><div><div><div><div><div>Hi Manfred,<br><br></div=
>Thanks for the interesting question. Having your code reviewed is an excel=
lent way to make progress.<br><br></div>For history variables, your code is=
 fine, but you should consider using the Stack module instead of re-impleme=
nting yourself using mutable lists. (Independently, when you have a record =
with a single mutable field, you could consider using the standard &quot;re=
f&quot; type instead; but sometimes having your own record type actually he=
lps readability.)<br><br></div>For the enumeration of ordinal numbers, ther=
e are two things that I am not fond of in your code:<br><br></div>1. I thin=
k that &quot;when&quot; is a dangerous construction to use and its use shou=
ld be de-emphasized, because it encourages code that relies on ordering in =
non-trivial way, diminishing a lot of the value of pattern-matching. The fa=
ct that, apart from the &quot;when&quot; clause, you are not using expressi=
ve patterns in any way is the sign of a code smell in my book. When I teach=
 beginners, I ask them to only pattern-match on algebraic datatypes. I woul=
d encourage you to rewrite this part with an explicit &quot;if ... else if =
...&quot; cascade.<br><br></div><div>You could also decide to factorize the=
 three cases with a function<br></div><div><br>=C2=A0 let non_th n =3D<br>=
=C2=A0=C2=A0=C2=A0 let d =3D n mod 10 in<br>=C2=A0=C2=A0=C2=A0 d &gt;=3D 1 =
&amp;&amp; d &lt;=3D 3 &amp;&amp; n mod 100 &lt;&gt; (10 + d) in<br></div><=
div><br></div><div>2. The creation of the array in &quot;f&quot; seems unne=
cessary to me. Using a &quot;for&quot; loop would result in simpler code, w=
hose structure would be more directly apparent to readers.<br><br></div><di=
v>(If you like functional pipelines with higher-order iterator, you may be =
pleased by the following reformulation of your code, that I think is still =
not as good as a for loop:<br><br></div><div>=C2=A0 Array.init ...<br></div=
><div>=C2=A0 |&gt; Array.iter ...<br></div><div>=C2=A0 |&gt; print_newline<=
br>)<br><br></div><div>In languages with powerful features, I think it is g=
ood to keep a principle of local simplicity: use the simplest feature that =
lets you express the problem without undue redundancy. (This rule of thumb =
is in tension with the other rules that the parts of a given block of code =
should be at roughly the same abstraction level: if you need to do X, Y, Z =
in sequence, and only Y can be expressed simply with a for-loop, it&#39;s b=
etter to keep a homogeneous style.)<br><br></div><div>Cheers<br></div></div=
><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">On Tue, Dec 27, =
2016 at 10:40 AM, Manfred Lotz <a href=3D"mailto:[email protected]">man=
[email protected]</a> [ocaml_beginners] <span dir=3D"ltr">&lt;<a href=3D"m=
ailto:[email protected]" target=3D"_blank">ocaml_beginners@ya=
hoogroups.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" st=
yle=3D"border-left:1px #ccc solid;">Hi there,<br>
I have added OCaml solutions for two simple tasks at Rosettacode.<br>
<br>
As a mere beginner in OCaml I don&#39;t want to add bad quality stuff at<br=
>
Rosettacode, and thus (worst case) in the end make people believe<br>
OCaml were a bad language.<br>
<br>
Therefore, I would be happy if some of the more knowledgeable people<br>
around here could check if the code I added is OK.<br>
<br>
<a href=3D"http://rosettacode.org/wiki/History_variables#OCaml" rel=3D"nore=
ferrer" target=3D"_blank">http://rosettacode.org/wiki/<wbr>History_variable=
s#OCaml</a><br>
<a href=3D"http://rosettacode.org/wiki/N%27th#OCaml" rel=3D"noreferrer" tar=
get=3D"_blank">http://rosettacode.org/wiki/N%<wbr>27th#OCaml</a><br>
<br>
<br>
Thanks a lot.<br>
<br>
Manfred<br>
<br>
<br>
------------------------------<wbr>------<br>
Posted by: Manfred Lotz &lt;<a href=3D"mailto:[email protected]">manfre=
[email protected]</a>&gt;<br>
------------------------------<wbr>------<br>
<br>
Archives up to December 31, 2011 are also downloadable at <a href=3D"http:/=
/www.connettivo.net/cntprojects/ocaml_beginners" rel=3D"noreferrer" target=
=3D"_blank">http://www.connettivo.net/<wbr>cntprojects/ocaml_beginners</a><=
br>
The archives of the very official ocaml list (the seniors&#39; one) can be =
found at <a href=3D"http://caml.inria.fr" rel=3D"noreferrer" target=3D"_bla=
nk">http://caml.inria.fr</a><br>
Attachments are banned and you&#39;re asked to be polite, avoid flames etc.=
<br>
------------------------------<wbr>------<br>
<br>
Yahoo Groups Links<br>
<br>
&lt;*&gt; To visit your group on the web, go to:<br>
=C2=A0 =C2=A0 <a href=3D"http://groups.yahoo.com/group/ocaml_beginners/" re=
l=3D"noreferrer" target=3D"_blank">http://groups.yahoo.com/group/<wbr>ocaml=
_beginners/</a><br>
<br>
&lt;*&gt; Your email settings:<br>
=C2=A0 =C2=A0 Individual Email | Traditional<br>
<br>
&lt;*&gt; To change settings online go to:<br>
=C2=A0 =C2=A0 <a href=3D"http://groups.yahoo.com/group/ocaml_beginners/join=
" rel=3D"noreferrer" target=3D"_blank">http://groups.yahoo.com/group/<wbr>o=
caml_beginners/join</a><br>
=C2=A0 =C2=A0 (Yahoo! ID required)<br>
<br>
&lt;*&gt; To change settings via email:<br>
=C2=A0 =C2=A0 <a href=3D"mailto:[email protected]">oca=
ml_beginners-digest@<wbr>yahoogroups.com</a><br>
=C2=A0 =C2=A0 <a href=3D"mailto:[email protected]=
m">ocaml_beginners-fullfeatured@<wbr>yahoogroups.com</a><br>
<br>
&lt;*&gt; To unsubscribe from this group, send an email to:<br>
=C2=A0 =C2=A0 <a href=3D"mailto:[email protected]=
">ocaml_beginners-unsubscribe@<wbr>yahoogroups.com</a><br>
<br>
&lt;*&gt; Your use of Yahoo Groups is subject to:<br>
=C2=A0 =C2=A0 <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/terms/"=
 rel=3D"noreferrer" target=3D"_blank">https://info.yahoo.com/legal/<wbr>us/=
yahoo/utos/terms/</a><br>
<br>
</blockquote></div><br></div>
</p>

    </div>
=20=20=20=20=20

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style=3D"color: #fff; height: 0;">__._,_.___</div>

=20=20=20=20=20=20=20=20=20=20
=20=20
=20

=20=20=20=20
    <div style=3D"clear:both"> </div>

    <div id=3D"fromDMARC" style=3D"margin-top: 10px;">
        <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background=
-color:#E3E3E3;">
        Posted by: Gabriel Scherer &lt;[email protected]&gt;       =
 <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background-color:=
#E3E3E3;">
     </div>
    <div style=3D"clear:both"> </div>

    <table cellspacing=3D4px style=3D"margin-top: 10px; margin-bottom: 10px=
; color: #2D50FD;">
      <tbody>
        <tr>
          <td style=3D"font-size: 12px; font-family: arial; font-weight: bo=
ld; padding: 7px 5px 5px;"  >
                          <a style=3D"text-decoration: none; color: #2D50FD=
" href=3D"https://groups.yahoo.com/neo/groups/ocaml_beginners/conversations=
/messages/14726;_ylc=3DX3oDMTJxc2JwN25jBF9TAzk3MzU5NzE0BGdycElkAzQ5OTkxOTQE=
Z3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzE0NzI2BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTQ=
4Mjg1NDQ2Ng--?act=3Dreply&messageNum=3D14726">Reply via web post</a>
                      </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
            <a href=3D"mailto:[email protected]?subject=3DRe%3A%20%=
22ocaml_beginners%22%3A%3A%5B%5D%20Rosetta%20code%20added%20in%20OCaml%2C%2=
0please%20check" style=3D"text-decoration: none; color: #2D50FD;">
               Reply to sender            </a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;">
            <a href=3D"mailto:[email protected]?subject=3DRe%=
3A%20%22ocaml_beginners%22%3A%3A%5B%5D%20Rosetta%20code%20added%20in%20OCam=
l%2C%20please%20check" style=3D"text-decoration: none; color: #2D50FD">
              Reply to group            </a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
            <a href=3D"https://groups.yahoo.com/neo/groups/ocaml_beginners/=
conversations/newtopic;_ylc=3DX3oDMTJlaG81a3RtBF9TAzk3MzU5NzE0BGdycElkAzQ5O=
TkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTQ4Mjg1NDQ2=
Ng--" style=3D"text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td>&bull;</td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;color: #2D50FD;" >
                            <a href=3D"https://groups.yahoo.com/neo/groups/=
ocaml_beginners/conversations/topics/14725;_ylc=3DX3oDMTM2Z2k3NDhuBF9TAzk3M=
zU5NzE0BGdycElkAzQ5OTkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzE0NzI2BHNlYwNm=
dHIEc2xrA3Z0cGMEc3RpbWUDMTQ4Mjg1NDQ2NgR0cGNJZAMxNDcyNQ--" style=3D"text-dec=
oration: none; color: #2D50FD;">Messages in this topic</a>
                (2)
                      </td>
        </tr>
      </tbody>
    </table>

=20=20=20=20=20=20=20=20
<div id=3D"megaphoneModule">
            <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; backgr=
ound-color:#E3E3E3;">
        <div>
	     <div class=3D"stream" style=3D"margin-bottom:10px;">
        <div style=3D"background-color:white;">
            <div class=3D"sn-img" style=3D"display:inline;"><img name=3D"tn=
_file" style=3D"padding:0px 10px;vertical-align:top;margin-top:5px;" src=3D=
"https://s.yimg.com/ru/static/images/yg/img/megaphone/1464031581_phpFA8bON"=
 height=3D"82" width=3D"82"></div>
            <div class=3D"mod-txt" style=3D"display:inline-block;">
                <a rel=3D"nofollow" name=3D"sub_url" target=3D"_blank" href=
=3D"https://yho.com/1wwmgg" style=3D"color:#0000FF;display:block;margin-lef=
t:5px;text-decoration:none;"><span style=3D"font-size:15px;">Have you tried=
 the highest rated email app?</span></a>
                <div style=3D"max-width:530px;padding:2px 5px;">With 4.5 st=
ars in iTunes, the Yahoo Mail app is the highest rated email app on the mar=
ket. What are you waiting for? Now you can access all your inboxes (Gmail, =
Outlook, AOL and more) in one place. Never delete an email again with 1000G=
B of free cloud storage.</div>
            </div>
        </div>
    </div>        </div>=20=20
=20=20=20=20=20
    <hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background-col=
or:#E3E3E3;">
</div>

<!------- Start Nav Bar ------>


    <div id=3D"ygrp-grfd" style=3D"font-family: Verdana; font-size: 12px; p=
adding: 15px 0;">
=20=20=20=20=20=20
<!-- |**|begin egp html banner|**| -->

      Archives up to December 31, 2011 are also downloadable at <a href=3D"=
http://www.connettivo.net/cntprojects/ocaml_beginners">http://www.connettiv=
o.net/cntprojects/ocaml_beginners</a><BR>
The archives of the very official ocaml list (the seniors' one) can be foun=
d at <a href=3D"http://caml.inria.fr">http://caml.inria.fr</a><BR>
Attachments are banned and you're asked to be polite, avoid flames etc.    =
=20=20
<!-- |**|end egp html banner|**| -->

    </div>
=20=20

=20

<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-family: Ver=
dana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-transf=
orm: uppercase; "><a href=3D"https://groups.yahoo.com/neo/groups/ocaml_begi=
nners/info;_ylc=3DX3oDMTJlcHY2MmljBF9TAzk3MzU5NzE0BGdycElkAzQ5OTkxOTQEZ3Jwc=
3BJZAMxNzA1MDA2NzY0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTQ4Mjg1NDQ2Ng--" style=
=3D"text-decoration: none;">Visit Your Group</a></span>

     <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
                                                    </ul>
  </div>


<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
  <a href=3D"https://groups.yahoo.com/neo;_ylc=3DX3oDMTJkcHZzNmJjBF9TAzk3ND=
c2NTkwBGdycElkAzQ5OTkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA2dmcARzd=
GltZQMxNDgyODU0NDY3" style=3D"float: left;"><img src=3D"http://l.yimg.com/r=
u/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15"=
 width=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;"> &bull; <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> &bull; <a href=3D"mailto:ocaml_beginners-unsubscribe@=
yahoogroups.com?subject=3DUnsubscribe" style=3D"text-decoration: none;">Uns=
ubscribe</a> &bull; <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/t=
erms/" style=3D"text-decoration: none;">Terms of Use</a> </div>
</div>
<br>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

=20
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m=
argin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id=3D"ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style=3D"clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D4999194/grpspI=
d=3D1705006764/msgId=3D14726/stime=3D1482854466" width=3D"1" height=3D"1"> =
<br>

<img src=3D"http://y.analytics.yahoo.com/fpc.pl?ywarid=3D515FB27823A7407E&a=
=3D10001310322279&js=3Dno&resp=3Dimg&cf12=3DCP" width=3D"1" height=3D"1">=20

<div style=3D"color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type=3D"text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
=20=20
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi=
le-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div=
.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  }=20

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important;=20
  }=20
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--001a11378bb495e7fd0544a5f57c--