<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>brool &#187; tricks</title>
	<atom:link href="http://www.brool.com/index.php/tag/tricks/feed" rel="self" type="application/rss+xml" />
	<link>http://www.brool.com</link>
	<description>brool \brool\ (n.) : a low roar; a deep murmur or humming</description>
	<lastBuildDate>Fri, 20 Jan 2012 07:58:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Stupid Haskell Tricks</title>
		<link>http://www.brool.com/index.php/stupid-haskell-tricks</link>
		<comments>http://www.brool.com/index.php/stupid-haskell-tricks#comments</comments>
		<pubDate>Mon, 13 Apr 2009 10:25:30 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[stupid]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://www.brool.com/?p=294</guid>
		<description><![CDATA[Let&#8217;s say that you really, really want some notion of objected oriented programming. So let&#8217;s make a class that represents a name, and some simple method calls on it: data S = S &#123; name :: String &#125; deriving &#40;Show&#41; firstname s = &#40;words &#40;name s&#41;&#41;!!0 lastname s = &#40;words &#40;name s&#41;&#41;!!1 But, dammit, you [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say that you really, <i>really</i> want some notion of objected oriented programming.  So let&#8217;s make a class that represents a name, and some simple method calls on it:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw1">data</span> S <span class="sy0">=</span> S <span class="br0">&#123;</span> name <span class="sy0">::</span> <span class="kw4">String</span> <span class="br0">&#125;</span> <span class="kw1">deriving</span> <span class="br0">&#40;</span><span class="kw4">Show</span><span class="br0">&#41;</span>
firstname s <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">words</span> <span class="br0">&#40;</span>name s<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">!!</span><span class="nu0">0</span>
lastname  s <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">words</span> <span class="br0">&#40;</span>name s<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">!!</span><span class="nu0">1</span></pre></div></div></div></div></div></div></div>



<p>But, dammit, you want to invoke it like you would in C++.  So define a function:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="kw1">let</span> <span class="br0">&#40;</span><span class="co2">--&gt;</span><span class="br0">&#41;</span> x f <span class="sy0">=</span> f x
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="kw1">let</span> test <span class="sy0">=</span> S <span class="st0">&quot;George Washington&quot;</span>
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> test <span class="co2">--&gt;</span> firstname
<span class="st0">&quot;George&quot;</span>
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> test <span class="co2">--&gt;</span> lastname
<span class="st0">&quot;Washington&quot;</span></pre></div></div></div></div></div></div></div>



<p>(It&#8217;s tempting to use `.`, but it conflicts with the Prelude.  Also note that you could define it as &#8220;(&#8211;>) = flip ($)&#8221;).  But what if it takes more than one parameter?</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="kw1">let</span> flip<span class="sy0">_</span>concat t s <span class="sy0">=</span> intercalate t <span class="sy0">$</span> <span class="kw3">reverse</span><span class="sy0">.</span><span class="kw3">words</span> <span class="sy0">$</span> name s
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> test <span class="co2">--&gt;</span> flip<span class="sy0">_</span>concat <span class="st0">&quot;, &quot;</span>
<span class="st0">&quot;Washington, George&quot;</span>
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> test <span class="co2">--&gt;</span> flip<span class="sy0">_</span>concat<span class="br0">&#40;</span><span class="st0">&quot;, &quot;</span><span class="br0">&#41;</span>
<span class="st0">&quot;Washington, George&quot;</span></pre></div></div></div></div></div></div></div>



<p>&#8230; although you might not like that anything can be applied to (&#8211;>).</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span> <span class="co2">--&gt;</span> <span class="kw3">length</span>
<span class="nu0">3</span>
&nbsp;
<span class="kw1">class</span> Deref a <span class="kw1">where</span>
    <span class="br0">&#40;</span><span class="co2">--&gt;</span><span class="br0">&#41;</span> <span class="sy0">::</span> a <span class="sy0">-&gt;</span> <span class="br0">&#40;</span>a <span class="sy0">-&gt;</span> b<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> b
    x <span class="co2">--&gt;</span> f <span class="sy0">=</span> f x 
&nbsp;
<span class="kw1">instance</span> Deref S
&nbsp;
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span> <span class="co2">--&gt;</span> <span class="kw3">length</span>
&nbsp;
<span class="sy0">&lt;</span>interactive<span class="sy0">&gt;</span>:<span class="nu0">1</span>:<span class="nu0">0</span>:
    No <span class="kw1">instance</span> for <span class="br0">&#40;</span>Deref <span class="br0">&#91;</span>t<span class="br0">&#93;</span><span class="br0">&#41;</span>
      arising from a use <span class="kw1">of</span> `<span class="co2">--&gt;</span>' at <span class="sy0">&lt;</span>interactive<span class="sy0">&gt;</span>:<span class="nu0">1</span>:<span class="nu0">0</span><span class="sy0">-</span><span class="nu0">17</span>
    Possible fix: add an <span class="kw1">instance</span> declaration for <span class="br0">&#40;</span>Deref <span class="br0">&#91;</span>t<span class="br0">&#93;</span><span class="br0">&#41;</span>
    In the expression: <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#93;</span> <span class="co2">--&gt;</span> <span class="kw3">length</span>
    In the definition <span class="kw1">of</span> `it': it <span class="sy0">=</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#93;</span> <span class="co2">--&gt;</span> <span class="kw3">length</span></pre></div></div></div></div></div></div></div>



<p>You can even use tuple passing to make it look even more like a typical call.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">*</span>Main<span class="sy0">&gt;</span> <span class="kw1">let</span> pretty <span class="br0">&#40;</span>pre<span class="sy0">,</span> mid<span class="sy0">,</span> post<span class="br0">&#41;</span> s <span class="sy0">=</span> pre <span class="sy0">++</span> <span class="br0">&#40;</span>firstname s<span class="br0">&#41;</span> <span class="sy0">++</span> mid <span class="sy0">++</span> <span class="br0">&#40;</span>lastname s<span class="br0">&#41;</span> <span class="sy0">++</span> post
<span class="sy0">*</span>Main<span class="sy0">&gt;</span> test <span class="co2">--&gt;</span> pretty <span class="br0">&#40;</span><span class="st0">&quot;&lt;&quot;</span><span class="sy0">,</span> <span class="st0">&quot;, &quot;</span><span class="sy0">,</span> <span class="st0">&quot;&gt;&quot;</span><span class="br0">&#41;</span>
<span class="st0">&quot;&lt;George, Washington&gt;&quot;</span></pre></div></div></div></div></div></div></div>



<p>&#8230; although that makes it harder to curry. </p>]]></content:encoded>
			<wfw:commentRss>http://www.brool.com/index.php/stupid-haskell-tricks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

