<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
    <title>downgra.de</title>
    <link href="http://downgra.de/atom.xml" rel="self"/>
    <link href="http://downgra.de"/>
    <updated>2010-12-05T19:27:28Z</updated>
    <id>http://downgra.de</id>
    <author>
        <name>Rico Schiekel</name>
        <email>blog@downgra.de</email>
    </author>

    
    <entry>
        <title>blog renewal</title>
        <link href="http://downgra.de/2009/04/04/blog-renewal"/>
        <updated>2009-04-04T00:00:00Z</updated>
        <id>2009/04/04/blog-renewal</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;blog renewal&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-04-04&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/04/04/blog-renewal#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                growl,
            
                python,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;after long time of inactivity I decide to revive my blog. but I no longer
want to go with &lt;a href=&#34;http://nanoblogger.sourceforge.net/&#34;&gt;nanoblogger&lt;/a&gt; for 
several personal reasons.&lt;/p&gt;

&lt;p&gt;I looked around and some time I stumbled over &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&lt;/a&gt;. a really nice
piece of work. but after some fuckup trying to get &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&#39;s&lt;/a&gt; dependency
gems installed and mucking around with the &lt;a href=&#34;http://pygments.org/&#34; title=&#34;pygments&#34;&gt;pygments&lt;/a&gt; integration,
I found more and more odds and ends which prevent me to use &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&lt;/a&gt;
for my blog. ok, I must admit, I&#39;m also not a really big fan of &lt;a href=&#34;http://www.ruby-lang.org/&#34; title=&#34;ruby&#34;&gt;ruby&lt;/a&gt;. ;)&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://github.com/lakshmivyas/hyde/tree/master&#34; title=&#34;hyde&#34;&gt;hyde&lt;/a&gt;, the &#34;evil Python transformation&#34; of &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&lt;/a&gt;, is imho
a bit to over-engineered. I personally miss the simplicity of &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;so what to do?&lt;/p&gt;

&lt;p&gt;I decide to reinvent the wheel again and implement a brand new &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt;
based static site generator. I think &lt;a href=&#34;http://github.com/mojombo/jekyll/tree/master&#34; title=&#34;jekyll&#34;&gt;jekyll&lt;/a&gt; and &lt;a href=&#34;http://github.com/lakshmivyas/hyde/tree/master&#34; title=&#34;hyde&#34;&gt;hyde&lt;/a&gt;
are both very good implementations. so I shameless stole as much as I can. (on 
the other side I&#39;m really really lazy guy)&lt;/p&gt;

&lt;p&gt;thanks a lot to all those people.&lt;/p&gt;

&lt;p&gt;at the moment you are looking on the output from the &lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34; title=&#34;growl&#34;&gt;fruits&lt;/a&gt; of my work.
&lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34; title=&#34;growl&#34;&gt;growl&lt;/a&gt; is now in a useable and hopefull more or less bugfree state. so
feel free to experiment with it, and let me know if you like it.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;

&lt;h3&gt;features&lt;/h3&gt;

&lt;p&gt;my favourite features are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;minimal dependencies&lt;/p&gt;

&lt;p&gt;you only need a standard &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt; install and the
&lt;a href=&#34;http://www.yaml.org/&#34;&gt;python-yaml&lt;/a&gt; package. all other is optional. &lt;/p&gt;

&lt;p&gt;nevertheless I recomment &lt;a href=&#34;http://jinja.pocoo.org/2/&#34;&gt;jinja2&lt;/a&gt;. but you are free to use
&lt;a href=&#34;http://www.djangoproject.com/&#34;&gt;django templates&lt;/a&gt;, &lt;a href=&#34;http://www.makotemplates.org/&#34;&gt;mako&lt;/a&gt;,
&lt;a href=&#34;http://www.cheetahtemplate.org/&#34;&gt;cheetah&lt;/a&gt; or whatever you like.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://daringfireball.net/projects/markdown/&#34;&gt;markdown&lt;/a&gt; and
&lt;a href=&#34;http://www.textism.com/tools/textile/&#34;&gt;textile&lt;/a&gt; are also supported out of the box
like &lt;a href=&#34;http://jinja.pocoo.org/2/&#34;&gt;jinja2&lt;/a&gt;, if the corresponding &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt;
packages are installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;easy to install (and use?) ;)&lt;/p&gt;

&lt;p&gt;simply install the few needed python packages and then use &lt;code&gt;growl.py&lt;/code&gt; directly,
or copy the file to a directory in your &lt;code&gt;$PATH&lt;/code&gt;. thats all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;easy to extend&lt;/p&gt;

&lt;p&gt;using hooks, you can use other template engines, add support for other markup syntax
or add metadata to your site context. and all with only a few lines of &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt;
code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;code, examples&lt;/h3&gt;

&lt;p&gt;take a look at &lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34;&gt;growl&lt;/a&gt; and as example the &lt;a href=&#34;http://github.com/xfire/downgrade/tree/master&#34;&gt;code&lt;/a&gt;
of this site.&lt;/p&gt;

&lt;h3&gt;bugs&lt;/h3&gt;

&lt;p&gt;please report any bugs you may discover
&lt;a href=&#34;http://http://bugs.projects.spamt.net/cgi-bin/bugzilla3/enter_bug.cgi?product=growl&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;license&lt;/h3&gt;

&lt;p&gt;the license is &lt;a href=&#34;http://www.gnu.org/licenses/gpl-2.0.html&#34;&gt;GPLv2&lt;/a&gt;.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;blog-renewal&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>960 css framework</title>
        <link href="http://downgra.de/2009/04/06/960-css-framework"/>
        <updated>2009-04-06T00:00:00Z</updated>
        <id>2009/04/06/960-css-framework</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;960 css framework&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-04-06&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/04/06/960-css-framework#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                css
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;doing website layouts using css can sometimes be a real &lt;a href=&#34;http://en.wiktionary.org/wiki/pain_in_the_ass&#34; title=&#34;pain in the ass&#34;&gt;pita&lt;/a&gt;. there
are a lot of css frameworks out in the wild. the one which impresse me the
most because of its simplicity is the &lt;a href=&#34;http://960.gs/&#34; title=&#34;960 grid system&#34;&gt;960 grid system&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;the &lt;a href=&#34;http://960.gs/&#34; title=&#34;960 grid system&#34;&gt;960 grid system&lt;/a&gt; defines a 960 pixel wide content pane and offer
12 or 16 columns, which can be used separately or in tandem. the site content
can now be spanned in those columns. the only rule is, that each row must be
completely defined.&lt;/p&gt;

&lt;p&gt;setting up your layout is done by creating &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tags with the correct
css classes.&lt;/p&gt;

&lt;p&gt;this may look like this:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;container_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;header&amp;quot;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sidebar&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_3&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;content&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_9&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;footer&amp;quot;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with this you got an header and footer going over the complete available
width of &lt;code&gt;960px&lt;/code&gt;. between you got a sidebar alongside the content pane.
since we used the 12 column container, the sidebar is
&lt;code&gt;3 * (60px + 2 * 10px)&lt;/code&gt; = &lt;code&gt;240px&lt;/code&gt; wide, the content pane
&lt;code&gt;9 * (60px + 2 * 10px)&lt;/code&gt; = &lt;code&gt;720px&lt;/code&gt;. now you may ask, what these &lt;code&gt;2 * 10px&lt;/code&gt;
are. each column in a 12 column grid has a width of &lt;code&gt;60px&lt;/code&gt; with &lt;code&gt;10px&lt;/code&gt;
margin on the left and right. on a 16 column grid, a column is &lt;code&gt;40px&lt;/code&gt; wide,
also with &lt;code&gt;10px&lt;/code&gt; margin on the left and right.&lt;/p&gt;

&lt;p&gt;you can also nest your div&#39;s, but now those &lt;code&gt;10px&lt;/code&gt; margins get in the way.
to solve this, you can specify a &lt;code&gt;alpha&lt;/code&gt; and a &lt;code&gt;omega&lt;/code&gt; class to the
first and last div. e.g.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;container_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;header&amp;quot;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;title&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_4 alpha&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;empty&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_4&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;info&amp;quot;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_4 omega&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sidebar&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_3&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;content&amp;quot;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_9&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;nt&#34;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;footer&amp;quot;&lt;/span&gt;  &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;grid_12&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&#34;nt&#34;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ah, one thing you should mind is, that you don&#39;t define a padding or margin
for a div which already has a &lt;code&gt;grid_??&lt;/code&gt; class set. use a second, nested
div to achieve this.&lt;/p&gt;

&lt;p&gt;imho all really easy. best you play a bit around and look at some
&lt;a href=&#34;http://github.com/xfire/downgrade/tree/master&#34;&gt;examples&lt;/a&gt;.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;960-css-framework&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>release jitertools version 1.1</title>
        <link href="http://downgra.de/2009/04/07/release-jitertools-1.1"/>
        <updated>2009-04-07T00:00:00Z</updated>
        <id>2009/04/07/release-jitertools-1.1</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;release jitertools version 1.1&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-04-07&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/04/07/release-jitertools-1.1#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                java,
            
                python,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;&lt;a href=&#34;http://github.com/xfire/jitertools/tree/v1.1&#34; title=&#34;jitertools 1.1 - github&#34;&gt;version 1.1&lt;/a&gt; of the &lt;a href=&#34;http://github.com/xfire/jitertools/tree/&#34; title=&#34;jitertools - github&#34;&gt;jitertools&lt;/a&gt; is released. this is the
first public release and hopefully this little pet project is usefull for you.&lt;/p&gt;

&lt;p&gt;for details, look at the &lt;code&gt;README&lt;/code&gt; in the &lt;a href=&#34;http://github.com/xfire/jitertools/tree/&#34; title=&#34;jitertools - github&#34;&gt;project root&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;release-jitertools-version-11&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>release jitertools version 1.2</title>
        <link href="http://downgra.de/2009/04/21/release-jitertools-1.2"/>
        <updated>2009-04-21T00:00:00Z</updated>
        <id>2009/04/21/release-jitertools-1.2</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;release jitertools version 1.2&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-04-21&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/04/21/release-jitertools-1.2#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                java,
            
                python,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;I just released &lt;a href=&#34;http://github.com/xfire/jitertools/tree/v1.2&#34; title=&#34;jitertools 1.2 - github&#34;&gt;version 1.2&lt;/a&gt; of the &lt;a href=&#34;http://github.com/xfire/jitertools/tree/&#34; title=&#34;jitertools - github&#34;&gt;jitertools&lt;/a&gt; library. this release adds 
new functions (tabulate, nth and consume) and fixes some minor bugs.&lt;/p&gt;

&lt;p&gt;also I manage issues now directly on &lt;a href=&#34;http://github.com/xfire/jitertools/issues&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;for details, look at the &lt;code&gt;README&lt;/code&gt; in the &lt;a href=&#34;http://github.com/xfire/jitertools/tree/&#34; title=&#34;jitertools - github&#34;&gt;project root&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;release-jitertools-version-12&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>release growl version 0.3</title>
        <link href="http://downgra.de/2009/05/07/release-growl-0.3"/>
        <updated>2009-05-07T00:00:00Z</updated>
        <id>2009/05/07/release-growl-0.3</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;release growl version 0.3&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-05-07&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/05/07/release-growl-0.3#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                growl,
            
                python,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;I just released &lt;a href=&#34;http://github.com/xfire/growl/tree/v0.3&#34; title=&#34;growl 0.3 - github&#34;&gt;version 0.3&lt;/a&gt; of &lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34; title=&#34;growl - github&#34;&gt;growl&lt;/a&gt;. this release adds 
a better deploying facility (&lt;code&gt;--deploy&lt;/code&gt; and &lt;code&gt;post.publish&lt;/code&gt;) and simplifies the
&lt;code&gt;wrap()&lt;/code&gt; helper function.&lt;/p&gt;

&lt;p&gt;also I manage issues now directly on &lt;a href=&#34;http://github.com/xfire/growl/issues&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;for details, look at the &lt;code&gt;README&lt;/code&gt; in the &lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34; title=&#34;growl - github&#34;&gt;project root&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;release-growl-version-03&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>python monkey patching</title>
        <link href="http://downgra.de/2009/05/16/python-monkey-patching"/>
        <updated>2009-05-16T00:00:00Z</updated>
        <id>2009/05/16/python-monkey-patching</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;python monkey patching&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-05-16&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/05/16/python-monkey-patching#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                python,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;to support an easy and &lt;a href=&#34;http://en.wikipedia.org/wiki/KISS_principle&#34; title=&#34;Keep it Simple, Stupid&#34;&gt;kiss&lt;/a&gt; way for &lt;a href=&#34;http://github.com/xfire/growl/tree/master&#34; title=&#34;growl - github&#34;&gt;growl&lt;/a&gt; hooks to extend
the existing classes, I wrote a &lt;code&gt;wrap()&lt;/code&gt; decorator, which overwrite an
existing class method. the overwritten, original method will be passed as
parameter to the new method.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;wrap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
    &lt;span class=&#34;sd&#34;&gt;&amp;quot;&amp;quot;&amp;quot; decorator to wrap an existing method of a class.&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;        e.g.&lt;/span&gt;

&lt;span class=&#34;sd&#34;&gt;        @wrap(Post.write)&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;        def verbose_write(forig, self):&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;            print &amp;#39;generating post: %s (from: %s)&amp;#39; % (self.title,&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;                                                      self.filename)&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;            return forig(self)&lt;/span&gt;

&lt;span class=&#34;sd&#34;&gt;        the first parameter of the new function is the the original,&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;        overwritten function (&amp;#39;forig&amp;#39;).&lt;/span&gt;
&lt;span class=&#34;sd&#34;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class=&#34;c&#34;&gt;# har, some funky python magic NOW!&lt;/span&gt;
    &lt;span class=&#34;nd&#34;&gt;@functools.wraps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;outer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;wrapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kwargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inspect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ismethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
            &lt;span class=&#34;nb&#34;&gt;setattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;im_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;orig_func&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;__name__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wrapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wrapper&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;outer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the example from the doc-string is imho meaningful enough. more examples
can be found in the &lt;a href=&#34;http://github.com/xfire/growl/tree/master/_hooks&#34; title=&#34;growl - github&#34;&gt;hooks directory&lt;/a&gt; of growl.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;python-monkey-patching&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>soups</title>
        <link href="http://downgra.de/2009/06/19/soups"/>
        <updated>2009-06-19T00:00:00Z</updated>
        <id>2009/06/19/soups</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;soups&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2009-06-19&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2009/06/19/soups#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                web
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;&lt;a href=&#34;http://blog.copton.net&#34;&gt;copton&lt;/a&gt;, a friend of me showed me some time ago a nice site
to easily gather urls, images, texts and other web related stuff.&lt;/p&gt;

&lt;p&gt;so here it is, my &lt;a href=&#34;http://soup.downgra.de&#34;&gt;soup&lt;/a&gt; (&lt;a href=&#34;http://www.soup.io&#34;&gt;http://www.soup.io&lt;/a&gt;)...&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;soups&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>playing with scala's enumerations</title>
        <link href="http://downgra.de/2010/02/11/playing-with-scala-enumeration"/>
        <updated>2010-02-11T00:00:00Z</updated>
        <id>2010/02/11/playing-with-scala-enumeration</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;playing with scala&amp;#39;s enumerations&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-02-11&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/02/11/playing-with-scala-enumeration#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;I lately wonder, if I can use special values with scala&#39;s &lt;a href=&#34;http://www.scala-lang.org/archives/beta-api/scala/Enumeration.html&#34; title=&#34;Enumeration&#34;&gt;Enumeration&lt;/a&gt; class.
this is my attempt to get it:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Planet&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Enumeration&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mass&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;radius&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Val&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;// universal gravitational constant  (m3 kg-1 s-2)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;G&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;6.67300E-11&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;surfaceGravity&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;G&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mass&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;radius&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;radius&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;surfaceWeight&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;otherMass&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;otherMass&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;surfaceGravity&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MERCURY&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Mercury&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.303e+23&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.4397e6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;VENUS&lt;/span&gt;   &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Venus&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;4.869e+24&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;6.0518e6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;EARTH&lt;/span&gt;   &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Earth&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;5.976e+24&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;6.37814e6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MARS&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Mars&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;6.421e+23&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.3972e6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;JUPITER&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Jupiter&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.9e+27&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;7.1492e7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SATURN&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Saturn&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mf&#34;&gt;5.688e+26&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;6.0268e7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;URANUS&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Uranus&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mf&#34;&gt;8.686e+25&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.5559e7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;NEPTUNE&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Neptune&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.024e+26&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.4746e7&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

  &lt;span class=&#34;c1&#34;&gt;// needed I think because Enumeration.elements is final and return the invariant &lt;/span&gt;
  &lt;span class=&#34;c1&#34;&gt;// type Enumeration.Value :|&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;valueToPlanet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;PlanetVal&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asInstanceOf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;PlanetVal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;EnumMain&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Usage:  scala Planet &amp;lt;earth_weight&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Planet._&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;earthWeight&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;toInt&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mass&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;earthWeight&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;EARTH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;surfaceGravity&lt;/span&gt;

      &lt;span class=&#34;nc&#34;&gt;Planet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foreach&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Your weight on %s is %f&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;surfaceWeight&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)))&lt;/span&gt;
      &lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;maybe someone can explain me why I need to use an explicit cast in the
&lt;code&gt;valueToPlanet&lt;/code&gt; function. why can&#39;t I say something like this?&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;valueToPlanet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;PlanetVal&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;using the code above, the program compiles, but then hangs while executing.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;playing-scalas-enumerations&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>scalatest with sbt and scala 2.8.beta1</title>
        <link href="http://downgra.de/2010/02/14/scalatest-with-sbt-and-scala-2.8.beta1"/>
        <updated>2010-02-14T00:00:00Z</updated>
        <id>2010/02/14/scalatest-with-sbt-and-scala-2.8.beta1</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;scalatest with sbt and scala 2.8.beta1&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-02-14&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/02/14/scalatest-with-sbt-and-scala-2.8.beta1#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;To get scalatest working for scala 2.8.Beta1 under &lt;a href=&#34;http://code.google.com/p/simple-build-tool/&#34; title=&#34;simple-build-tool&#34;&gt;sbt&lt;/a&gt; you need the following
configuration:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sbt._&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyProject&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;ProjectInfo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;DefaultProject&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;c1&#34;&gt;// External dependencies&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scalaToolsRepo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Scala-Tools Maven Repository&amp;quot;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;
    &lt;span class=&#34;s&#34;&gt;&amp;quot;http://nexus.scala-tools.org/content/repositories/snapshots/&amp;quot;&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scalatest&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;org.scalatest&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;scalatest&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;
    &lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.1-for-scala-2.8.0.Beta1-RC7-with-test-interfaces-0.3-SNAPSHOT&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;scalatest-sbt-and-scala-28beta1&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>haskell like type classes in scala</title>
        <link href="http://downgra.de/2010/06/21/haskell-like-type-classes-in-scala"/>
        <updated>2010-06-21T00:00:00Z</updated>
        <id>2010/06/21/haskell-like-type-classes-in-scala</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;haskell like type classes in scala&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-06-21&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/06/21/haskell-like-type-classes-in-scala#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                haskell,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;we all surely know how type classes in &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt; work and how to use them. ;)&lt;/p&gt;

&lt;p&gt;maybe a bit like this:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;kr&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;where&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; 
    &lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;concrete(&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;deriving&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;nf&#34;&gt;printIt&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;printIt&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;

&lt;span class=&#34;kr&#34;&gt;instance&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;where&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo(&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;), bar(&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;

&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;printIt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;hallo&amp;quot;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;welt&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;this example generates an output like this:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; runhaskell typeClass.hs
foo&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;hallo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, bar&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;welt&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; concrete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;FooBar &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;hallo&amp;quot;&lt;/span&gt;, &lt;span class=&#34;nv&#34;&gt;bar&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;quot;welt&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with &lt;a href=&#34;http://www.scala-lang.org/&#34; title=&#34;scala&#34;&gt;scala&lt;/a&gt; it is also possible to define and use type classes using &lt;code&gt;implicits&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;here&#39;s a simple example which has the advantage over &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt;, that the type instances
only apply to the surrounding scope, where the &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt; type instances are global. (please
correct me if I&#39;m wrong)&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;concrete(%s)&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;printIt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;T:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;implicitly&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]].&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
                                    &lt;span class=&#34;n&#34;&gt;implicitly&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]].&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyInstance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FooBarTypeClass&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a._&lt;/span&gt;
      &lt;span class=&#34;s&#34;&gt;&amp;quot;foo(%s), bar(%s)&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fb1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;hallo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;welt&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;MyInstance._&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;printIt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fb1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MySpecialInstance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;FooBarSpecialTypeClass&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyTypeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;absFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a._&lt;/span&gt;
      &lt;span class=&#34;s&#34;&gt;&amp;quot;FOO =&amp;gt; %s, BAR =&amp;gt; %s&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;FooBar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a._&lt;/span&gt;
      &lt;span class=&#34;s&#34;&gt;&amp;quot;concrete(%s, %s)&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;MySpecialInstance._&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;printIt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fb1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the output should look like this:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; scala typeClasses.scala
foo&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;hallo&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, bar&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;welt&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; concrete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Main&lt;span class=&#34;nv&#34;&gt;$$&lt;/span&gt;anon&lt;span class=&#34;nv&#34;&gt;$1$FooBar&lt;/span&gt;@fcfa52&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nv&#34;&gt;FOO&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt; hallo, &lt;span class=&#34;nv&#34;&gt;BAR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;gt; welt concrete&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;hallo, welt&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;please note, that scala 2.8 is needed.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;haskell-like-type-classes-in-scala&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>functors in scala and haskell part 1</title>
        <link href="http://downgra.de/2010/07/07/functors_in_scala_and_haskell_part_1"/>
        <updated>2010-07-07T00:00:00Z</updated>
        <id>2010/07/07/functors_in_scala_and_haskell_part_1</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;functors in scala and haskell part 1&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-07-07&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/07/07/functors_in_scala_and_haskell_part_1#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                haskell,
            
                functors,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;today I post some &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functor&lt;/a&gt; examples to show how to use them in &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt;
and in &lt;a href=&#34;http://www.scala-lang.org/&#34; title=&#34;scala&#34;&gt;scala&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt; functors are available in the &lt;code&gt;Control.Monad&lt;/code&gt; and the &lt;code&gt;Control.Monad.Instances&lt;/code&gt;
module.&lt;/p&gt;

&lt;p&gt;I won&#39;t reinvent the wheel so I use the &lt;a href=&#34;http://code.google.com/p/scalaz/&#34; title=&#34;scalaz&#34;&gt;scalaz&lt;/a&gt; library. This cool library provides
a lot of handy features like functors, applicative functors or monads.&lt;/p&gt;

&lt;p&gt;a good description what &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functors&lt;/a&gt; are, is the following sentence:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Functors are structure-preserving maps between categories.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;so, here is a example which should illustrate this behavior.&lt;/p&gt;

&lt;p&gt;first haskell:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;-- the simple tree datastructure&lt;/span&gt;
&lt;span class=&#34;kr&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
                 &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt;
                 &lt;span class=&#34;kr&#34;&gt;deriving&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;-- we need a functor instance for our Tree&lt;/span&gt;
&lt;span class=&#34;kr&#34;&gt;instance&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Functor&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;where&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt;        &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;-- our sample data&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;sampleTree&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;sampleTree&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Node&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;BlubBlub&amp;quot;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Empty&lt;/span&gt;

&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sampleTree&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sampleTree&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;generating the following output:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; runhaskell functorTree.hs
Node &lt;span class=&#34;s2&#34;&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Node &lt;span class=&#34;s2&#34;&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt; Empty &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Node &lt;span class=&#34;s2&#34;&gt;&amp;quot;BlubBlub&amp;quot;&lt;/span&gt; Empty Empty&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; Empty
Node 3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Node 3 Empty &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Node 8 Empty Empty&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; Empty
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;you see, the sample tree containing the strings is mapped to a new tree containing
the length of the several strings. the structure of the tree remain intact.&lt;/p&gt;

&lt;p&gt;now scala using &lt;a href=&#34;http://code.google.com/p/scalaz/&#34; title=&#34;scalaz&#34;&gt;scalaz&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Scalaz._&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;// the simple tree datastructure&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;sealed&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;abstract&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;nc&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;// we need a functor instance for our Tree&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;TreeFunctor&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Functor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;, &lt;span class=&#34;kt&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;// our sample data&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sampleTree&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt;
    &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;BlubBlub&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())),&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sampleTree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sampleTree&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;


&lt;span class=&#34;o&#34;&gt;:::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bash&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;functorTree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;
&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Foo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Bar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;BlubBlub&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;
&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())),&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Empty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;these both examples show, that for own types like our tree, special &lt;code&gt;fmap&lt;/code&gt; or rather functor instances
must be written. most times this is done easily, but those instance must follow some simple rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identity morphism: &lt;code&gt;fmap id = id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;composition morphism: &lt;code&gt;fmap (f . g) = fmap f . fmap g&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;so &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functors&lt;/a&gt; are a awesome abstraction over data structures and a corner stone for
&lt;a href=&#34;http://en.wikipedia.org/wiki/Monad_(functional_programming)&#34; title=&#34;monad&#34;&gt;monads&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;enough for now...&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;

&lt;p&gt;ps: I&#39;m in the beginning of understanding the &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory&#34; title=&#34;category theory&#34;&gt;category theory&lt;/a&gt;, so please correct me if I&#39;m
wrong on something.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;functors-in-scala-and-haskell-part-1&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>functors in scala and haskell part 2</title>
        <link href="http://downgra.de/2010/07/08/functors_in_scala_and_haskell_part_2"/>
        <updated>2010-07-08T00:00:00Z</updated>
        <id>2010/07/08/functors_in_scala_and_haskell_part_2</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;functors in scala and haskell part 2&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-07-08&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/07/08/functors_in_scala_and_haskell_part_2#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                haskell,
            
                functors,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;h6&gt;history&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://downgra.de/2010/07/07/functors_in_scala_and_haskell_part_1&#34; title=&#34;functors in scala and haskell part 1&#34;&gt;functors in scala and haskell part 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;this is part 2 of the &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functor&lt;/a&gt; survey with some fresh examples.&lt;/p&gt;

&lt;p&gt;first the haskell examples:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Control.Monad.Instances&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;-- output&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Just&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Nothing&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Right&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Left&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;which generates the following output:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; runhaskell fmaps.hs
&lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt;1,1,1&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;,&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;2,2,2&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;,&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;3,3,3&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;,&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;4,4,4&lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;
Just &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;4,4,4&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
Nothing
Right &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
Left &lt;span class=&#34;s2&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;very readable and handy...&lt;/p&gt;

&lt;p&gt;instead of &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&#39;s&lt;/a&gt; &lt;code&gt;fmap&lt;/code&gt; function, &lt;a href=&#34;http://code.google.com/p/scalaz/&#34; title=&#34;scalaz&#34;&gt;scalaz&lt;/a&gt; enables the &lt;code&gt;map&lt;/code&gt;
function to do the same thing using implicit functor instances. (take a look at the 
&lt;a href=&#34;http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/scalaz/Functor.scala.html&#34;&gt;implementation&lt;/a&gt;
and my article about &lt;a href=&#34;http://downgra.de/2010/06/21/haskell-like-type-classes-in-scala/&#34;&gt;type classes&lt;/a&gt;
for more informations)&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Scalaz._&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt;
                                                   &lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)))&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Some&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Some&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)))&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Option&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;// unlike haskell, Left and Right is handled the same&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Right&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;right&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;right&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt;
        &lt;span class=&#34;nc&#34;&gt;Right&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;right&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Left&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;left&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;replicate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt;
        &lt;span class=&#34;nc&#34;&gt;Left&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;you can see, &lt;a href=&#34;http://www.haskell.org/&#34; title=&#34;haskell&#34;&gt;haskell&lt;/a&gt; and &lt;a href=&#34;http://code.google.com/p/scalaz/&#34; title=&#34;scalaz&#34;&gt;scalaz&lt;/a&gt; define a lot of functor instances for
common data structures like Maybe / Option, Either or lists. &lt;/p&gt;

&lt;p&gt;not much stunning today, but maybe in the next part.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;functors-in-scala-and-haskell-part-2&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>functors in scala and haskell part 3</title>
        <link href="http://downgra.de/2010/07/13/functors_in_scala_and_haskell_part_3"/>
        <updated>2010-07-13T00:00:00Z</updated>
        <id>2010/07/13/functors_in_scala_and_haskell_part_3</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;functors in scala and haskell part 3&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-07-13&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/07/13/functors_in_scala_and_haskell_part_3#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                haskell,
            
                functors,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;h6&gt;history&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://downgra.de/2010/07/07/functors_in_scala_and_haskell_part_1&#34; title=&#34;functors in scala and haskell part 1&#34;&gt;functors in scala and haskell part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://downgra.de/2010/07/08/functors_in_scala_and_haskell_part_2&#34; title=&#34;functors in scala and haskell part 2&#34;&gt;functors in scala and haskell part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functors&lt;/a&gt; don&#39;t only work on data structures, but also on functions. so fmap&#39;ing 
the function &lt;code&gt;(*3) :: (Num a) =&amp;gt; a -&amp;gt; a&lt;/code&gt; over another function like &lt;code&gt;(+100) :: (Num a) =&amp;gt; a -&amp;gt; a&lt;/code&gt; results
in a new function which apply &lt;code&gt;(*3)&lt;/code&gt; to the result of &lt;code&gt;(+100)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;this sounds like something we already know. yeah, function composition with the dot &lt;code&gt;(.)&lt;/code&gt; function.
therefore the functor instance for functions must be written like this:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;kr&#34;&gt;instance&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Functor&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;where&lt;/span&gt;  
    &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;this instance is defined in the &lt;code&gt;Control.Monad.Instances&lt;/code&gt; module. here some examples&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Control.Monad.Instances&lt;/span&gt;

&lt;span class=&#34;nf&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;f3&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;

&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;()&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
   &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
   &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
   &lt;span class=&#34;n&#34;&gt;putStrLn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;resulting in the following output&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; runhaskell fmaps2.hs
303                              
303
&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;10_FOO&amp;quot;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;quot;20_FOO&amp;quot;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;quot;30_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pretty cool imho. now the same in &lt;a href=&#34;http://code.google.com/p/scalaz/&#34; title=&#34;scalaz&#34;&gt;scalaz&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Scalaz._&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Functor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Function1Functor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;303&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apply&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;303&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pure&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Identity&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;303&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pure&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Identity&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;303&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt;
        &lt;span class=&#34;nc&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;10_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;20_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;30_FOO&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I think this is relative straight forward. one problem are the implicit parameters when we
try to call the new mapped function. so best call the &lt;code&gt;apply(...)&lt;/code&gt; function directly.&lt;/p&gt;

&lt;p&gt;another little problem is the need of the &lt;code&gt;pure&lt;/code&gt; function on our sample value 1. &lt;a href=&#34;http://www.scala-lang.org/&#34; title=&#34;scala&#34;&gt;scala&lt;/a&gt; need
this type lifting to &lt;code&gt;Identity&lt;/code&gt; to get the map function ready for our value. maybe I&#39;m wrong here and
there is a better and simpler solution. any hint is welcome.&lt;/p&gt;

&lt;p&gt;so much for &lt;a href=&#34;http://en.wikipedia.org/wiki/Category_theory#Functors_2&#34; title=&#34;functors&#34;&gt;functors&lt;/a&gt; on functions.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;functors-in-scala-and-haskell-part-3&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>scala self-types</title>
        <link href="http://downgra.de/2010/07/15/scala_self-types"/>
        <updated>2010-07-15T00:00:00Z</updated>
        <id>2010/07/15/scala_self-types</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;scala self-types&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-07-15&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/07/15/scala_self-types#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                programming,
            
                scala
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;instead of &lt;a href=&#34;http://en.wikipedia.org/wiki/Multiple_inheritance&#34; title=&#34;multiple inheritance&#34;&gt;multiple inheritance&lt;/a&gt;, &lt;a href=&#34;http://www.scala-lang.org/&#34; title=&#34;scala&#34;&gt;scala&lt;/a&gt; provide a
&lt;a href=&#34;http://www.scala-lang.org/node/117&#34; title=&#34;scala mixin class composition&#34;&gt;mixin-based composition mechanism&lt;/a&gt;. this is usually done with traits, which
is excellent for decoupling behaviours.&lt;/p&gt;

&lt;p&gt;but sometimes you want to restrict these behaviours to a special domain. this can be done
with self-types. &lt;/p&gt;

&lt;p&gt;self-types are written as follows:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Foo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;SomeType&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;self&lt;/code&gt; here refers to &lt;code&gt;this&lt;/code&gt;, which can be very usefull in situations, where you can not
easily access the particular &lt;code&gt;this&lt;/code&gt; of the current context. &lt;br /&gt;
also &lt;code&gt;self&lt;/code&gt; can be extended with type bounds. in this example, the trait &lt;code&gt;Foo&lt;/code&gt; can
only be mixed in a class which also implements &lt;code&gt;SomeType&lt;/code&gt;. you can use this feature to
restrict behaviours to a special domain.&lt;/p&gt;

&lt;p&gt;I think the following examples are self-explanatory...&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SelfTypes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave1&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave2&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Independent&lt;/span&gt;

  &lt;span class=&#34;c1&#34;&gt;// constrain the traits A, B and C&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MustHave1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;B&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MustHave2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;C&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MustHave1&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;MustHave2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;c1&#34;&gt;// correct usage&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test3&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave2&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;C&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test4&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MustHave1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Independent&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test5&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test6&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Test3&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;// -- these examples do not type check&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;//  class Wrong1 extends A&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;//  class Wrong2 extends A with Independent&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;//  class Wrong3 extends MustHave2 with A&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;//  class Wrong4 extends MustHave1 with C&lt;/span&gt;

  &lt;span class=&#34;c1&#34;&gt;// mixing the behaviours Resize and ColorCount in our domain Image&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Resize&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Image&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resize&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newWidth&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newHeight&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Image&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;c1&#34;&gt;// a really stupid implementation&lt;/span&gt;
      &lt;span class=&#34;nc&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newWidth&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newHeight&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newWidth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newHeight&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;trait&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ColorCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Image&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foldLeft&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
                  &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Resize&lt;/span&gt;
                  &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ColorCount&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resize&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;width&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;scala-self-types&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>scala gotcha: blocks and functions</title>
        <link href="http://downgra.de/2010/08/05/scala_gotcha_blocks_and_functions"/>
        <updated>2010-08-05T00:00:00Z</updated>
        <id>2010/08/05/scala_gotcha_blocks_and_functions</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;scala gotcha: blocks and functions&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-08-05&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/08/05/scala_gotcha_blocks_and_functions#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scala,
            
                gotcha,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;today I stumble over a nasty scala gotcha. most people think that a code block is the same
as a function. this is not true. let&#39;s see why.&lt;/p&gt;

&lt;p&gt;first we define a function &lt;code&gt;f1&lt;/code&gt; which take another function as parameter.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;gt;&amp;gt; f1&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;lt;&amp;lt; f1&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;f:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Unit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;now we call &lt;code&gt;f1&lt;/code&gt; with a code block. I deliberately add an side-effect to show the (for most people
including me) unexpected behaviour.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  &amp;gt;&amp;gt; add 23&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;46&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;65&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;here the code block will be executed and the last statement &lt;code&gt;_ + 23&lt;/code&gt; will be passed to the function &lt;code&gt;f1&lt;/code&gt;.
the function &lt;code&gt;f1&lt;/code&gt; expect a parameter of the type &lt;code&gt;Int =&amp;gt; Int&lt;/code&gt;, so the last parameter of the block need to be
a function of this type.
the code block is executed only &lt;em&gt;once&lt;/em&gt;, and the function &lt;code&gt;f1&lt;/code&gt; receive a function of type &lt;code&gt;Int =&amp;gt; Int&lt;/code&gt; which
here add 23 to its parameter.&lt;/p&gt;

&lt;p&gt;here an example which show that &lt;code&gt;_ + 1&lt;/code&gt; is of type &lt;code&gt;Function1&lt;/code&gt; which is &lt;code&gt;Int =&amp;gt; Int&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;function1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;43&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the function &lt;code&gt;f1&lt;/code&gt; can also called with a normal function definition. calling &lt;code&gt;f1&lt;/code&gt; this way, the side-effect
is executed every time with the closure.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  &amp;gt;&amp;gt; add 42&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;65&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;84&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;special are functions which have no parameters. a way to express such a type is &lt;code&gt;() =&amp;gt; Int&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;gt;&amp;gt; f2&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;())&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;lt;&amp;lt; f2&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; 
&lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;f:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Unit&lt;/span&gt;

&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// won&amp;#39;t compile&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error:&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;mismatch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;;&lt;/span&gt;
 &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;   &lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
 &lt;span class=&#34;kt&#34;&gt;required:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt;
       &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// won&amp;#39;t compile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;but calling is not so straightforward.&lt;/p&gt;

&lt;p&gt;clearly, &lt;code&gt;() =&amp;gt;&lt;/code&gt; is missing. so, now it works. the side-effect is now in the function which is
received by &lt;code&gt;f2&lt;/code&gt;, the side-effect is executed every time with the closure.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  &amp;gt;&amp;gt; return 42&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the last way is to define a by-name parameter via &lt;code&gt;=&amp;gt; Int&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;gt;&amp;gt; f3&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  got &amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;lt;&amp;lt; f3&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;f:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;Unit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the code block is now handled in a special way. instead of executing it directly like in the first example, it
is converted to a function like object and passed to the function &lt;code&gt;f3&lt;/code&gt;. so the side-effect is called every time
with the closure.&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;scala&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;  &amp;gt;&amp;gt; return 23&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I hope this helps understanding this better.&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;scala-gotcha-blocks-and-functions&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>scala's package shortcut</title>
        <link href="http://downgra.de/2010/08/31/scalas_package_shortcut"/>
        <updated>2010-08-31T00:00:00Z</updated>
        <id>2010/08/31/scalas_package_shortcut</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;scala&amp;#39;s package shortcut&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-08-31&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/08/31/scalas_package_shortcut#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                programming,
            
                scala
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;keep in mind, that these three examples express exactly the same.&lt;/p&gt;

&lt;h3&gt;sample 1&lt;/h3&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SomeTest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;sample 2&lt;/h3&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;b&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;c&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SomeTest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;sample 3&lt;/h3&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a.b.c&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a._&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;a.b._&lt;/span&gt;

&lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;SomeTest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;scalas-package-shortcut&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>multi-line strings with scala</title>
        <link href="http://downgra.de/2010/09/14/multi-line_strings_with_scala"/>
        <updated>2010-09-14T00:00:00Z</updated>
        <id>2010/09/14/multi-line_strings_with_scala</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;multi-line strings with scala&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-09-14&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/09/14/multi-line_strings_with_scala#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                programming,
            
                scala
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;I love the multi-line strings from &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt;. very usefull, but there is always the problem
with the indentation. &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;python&lt;/a&gt; has an elegant solution, the
&lt;a href=&#34;http://docs.python.org/library/textwrap.html#textwrap.dedent&#34;&gt;&lt;code&gt;textwrap.dedent(text)&lt;/code&gt;&lt;/a&gt; function.&lt;/p&gt;

&lt;p&gt;scala has a almost as elegant solution, the
&lt;a href=&#34;http://www.scala-lang.org/api/current/scala/collection/immutable/StringLike.html&#34;&gt;&lt;code&gt;stripMargin&lt;/code&gt;&lt;/a&gt;
function.&lt;/p&gt;

&lt;p&gt;see it here in action:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;quot;&amp;quot;foo&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;   bar&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;
   &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;

&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;quot;&amp;quot;|foo&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;   |bar&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stripMargin&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;other than &lt;a href=&#34;http://www.python.org/&#34; title=&#34;python&#34;&gt;pythons&lt;/a&gt; function, &lt;a href=&#34;http://www.scala-lang.org/&#34; title=&#34;scala&#34;&gt;scalas&lt;/a&gt; &lt;code&gt;stripMargin&lt;/code&gt; function need a special
character to which leading whitespaces are removed. default is the pipe &lt;code&gt;|&lt;/code&gt;, but you can use
any charater you want:&lt;/p&gt;

&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;code&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;quot;&amp;quot;#spam&lt;/span&gt;
&lt;span class=&#34;s&#34;&gt;   #eggs&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stripMargin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;spam&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;eggs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;multi-line-strings-scala&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>release scopt version 2.0 - scala option parser</title>
        <link href="http://downgra.de/2010/09/25/release_scopt_version_2_dot_0_-_scala_option_parser"/>
        <updated>2010-09-25T00:00:00Z</updated>
        <id>2010/09/25/release_scopt_version_2_dot_0_-_scala_option_parser</id>
        <content type="html">
&lt;div class=&#34;post&#34;&gt;

    &lt;h1&gt;release scopt version 2.0 - scala option parser&lt;/h1&gt;
    &lt;span class=&#34;date&#34;&gt;2010-09-25&lt;/span&gt;
    &lt;span class=&#34;post-topics&#34;&gt;
        &lt;a href=&#34;http://downgra.de/2010/09/25/release_scopt_version_2_dot_0_-_scala_option_parser#disqus_thread&#34;&gt;comments&lt;/a&gt;
        
            |
            
                scopt,
            
                scala,
            
                programming
            
        
    &lt;/span&gt;

    &lt;div&gt;
        &lt;p&gt;I just release the beta of scopt v2, version 2.0 of the scala option parser.&lt;/p&gt;

&lt;p&gt;you can find the documentation and code on &lt;a href=&#34;http://github.com/xfire/scopt&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;hth&lt;/p&gt;
    &lt;/div&gt;

    &lt;div id=&#34;disqus_thread&#34;&gt;&lt;/div&gt;

    &lt;script type=&#34;text/javascript&#34;&gt;
      var disqus_identifier = &#39;release-scopt-version-20---scala-option-parser&#39;;
      (function() {
       var dsq = document.createElement(&#39;script&#39;); dsq.type = &#39;text/javascript&#39;; dsq.async = true;
       dsq.src = &#39;http://downgrade.disqus.com/embed.js&#39;;
       (document.getElementsByTagName(&#39;head&#39;)[0] || document.getElementsByTagName(&#39;body&#39;)[0]).appendChild(dsq);
      })();
    &lt;/script&gt;
    &lt;noscript&gt;Please enable JavaScript to view the &lt;a href=&#34;http://disqus.com/?ref_noscript=downgrade&#34;&gt;comments powered by Disqus.&lt;/a&gt;&lt;/noscript&gt;
    &lt;a href=&#34;http://disqus.com&#34; class=&#34;dsq-brlink&#34;&gt;blog comments powered by &lt;span class=&#34;logo-disqus&#34;&gt;Disqus&lt;/span&gt;&lt;/a&gt;

&lt;/div&gt;</content>
    </entry>
    
 
</feed>
