<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>haskell / Drkcore</title><link>http://blog.kzfmix.com/entry/haskell</link><description>Programming, Music, Snowboarding</description><atom:link href="http://blog.kzfmix.com/rss/" rel="self"></atom:link><language>ja</language><lastBuildDate>Sat, 09 Oct 2010 18:28:36 +0900</lastBuildDate><item><title>Real World Haskell 15章</title><link>http://blog.kzfmix.com/entry/1286616488</link><description>&lt;p&gt;モナドを使ったプログラミング&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51rAJvgAkgL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Real World Haskell―実戦で学ぶ関数型言語プログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Bryan O'Sullivan,John Goerzen,Don Stewart &lt;br /&gt;
オライリージャパン / ￥ 3,990 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;持ち上げの一般化(15.2)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;liftM2 :: (Monad m) =&amp;gt; (a1 -&amp;gt; a2 -&amp;gt; r) -&amp;gt; m a1 -&amp;gt; m a2 -&amp;gt; m r
Prelude Control.Monad&amp;gt; :t liftM

liftM :: (Monad m) =&amp;gt; (a1 -&amp;gt; r) -&amp;gt; m a1 -&amp;gt; m r
Prelude Control.Monad&amp;gt; :t ap
ap :: (Monad m) =&amp;gt; m (a -&amp;gt; b) -&amp;gt; m a -&amp;gt; m b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;liftM(N)はliftMとapを使って一般化できる。&lt;/p&gt;

&lt;p&gt;Readerモナドを大体理解した(15.6)。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;newtype Reader e a = R { runReader :: e -&amp;gt; a }

instance Monad (Reader e) where
    return a = R $ \_ -&amp;gt; a
    m &amp;gt;&amp;gt;= k  = R $ \r -&amp;gt; runReader (k (runReader m r)) r

ask :: Reader e e
ask = R id
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;askで得た環境を引き回す。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;*Main Data.Char&amp;gt; runReader (ask &amp;gt;&amp;gt;= \x -&amp;gt; return (x*3)) 2
6
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;askで常に同じ環境が返ってくる、読み取り専用のStateみたいなもんか。&lt;/p&gt;
</description><pubDate>Sat, 09 Oct 2010 18:28:36 +0900</pubDate><category>haskell</category><category>RWH</category></item><item><title>ポイントフリースタイルのhead</title><link>http://blog.kzfmix.com/entry/1167823357</link><description>&lt;p&gt;普通のhaskellプログラミングの216ページに&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ポイントフリースタイルへの書き換えは脊髄反射の速度でできるようにしてください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;と書いてあったのだけど、脊髄どころか反射すらできない。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;firstNLines&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="n"&gt;firstNLines&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;nを押し出すのってどうやるんだろうか?&lt;/p&gt;
&lt;h4&gt;追記07.01.03&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1167823081"&gt;解決した&lt;/a&gt;ヨ。&lt;/p&gt;</description><pubDate>Wed, 03 Jan 2007 20:22:37 +0900</pubDate><category>haskell</category></item><item><title>ポイントフリーなhead.hs</title><link>http://blog.kzfmix.com/entry/1167823081</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1167823357"&gt;下の式を完全なポイントフリースタイルにする&lt;/a&gt;方法を色々と考えてみたんだけど。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;firstNLines&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;結局分からんかったので、mixiで聞いてみたらさくっと教えてもらえた（ありがたい）。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;take&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unlines&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;take&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;.って演算子として考えればよいらしい。だから、左側を取るように書き換えてやればいいのか。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Prelude&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="n"&gt;Prelude&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;(+)だとこんな感じ。&lt;/p&gt;
&lt;p&gt;型を確認すると&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Prelude&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;.は(b -&amp;gt; c)と(a -&amp;gt; b)という関数をとってa-&amp;gt;cという関数を合成する関数(二項演算子?)なのか。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;関数合成で、変数が消えていくのは、こういうことなのね。&lt;/p&gt;</description><pubDate>Wed, 03 Jan 2007 20:18:01 +0900</pubDate><category>haskell</category></item><item><title>相変わらずモナドが</title><link>http://blog.kzfmix.com/entry/1159191155</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1152624865"&gt;モナドで躓いて&lt;/a&gt;以来、ちょっとご無沙汰していたhaskellだが、ちょっとまとまった時間ができたので、この週末でじっくり考えてみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/m-hiyama/20060419/1145432492"&gt;http://d.hatena.ne.jp/m-hiyama/20060419/1145432492&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://haskell.g.hatena.ne.jp/taninsw/20060624/p1"&gt;http://haskell.g.hatena.ne.jp/taninsw/20060624/p1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO"&gt;http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.livedoor.jp/dankogai/archives/50462995.html"&gt;http://blog.livedoor.jp/dankogai/archives/50462995.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;モナドだけに、読むたび必ず睡魔に襲われる（参照透明性確保！）でも理解度はちょっぴり向上してるっぽい(つまり副作用)。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/m-hiyama/20060419/1145432492"&gt;檜山正幸のキマイラ飼育記&lt;/a&gt;はjavascriptを例にして、純関数にすること（参照透明性の確保?）と型を揃えることが重要っぽいあたりが理解できた。&lt;br /&gt;
で、&lt;a href="http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO"&gt;HaHaHa!&lt;/a&gt;では思考をもうチョイ広げて、とりまく環境の変化ということに思いをめぐらせればいいということを理解した。特に図がわかりやすくて、かなり理解が進んだと思う。&lt;br /&gt;
で、それから、実際に&lt;a href="http://blog.livedoor.jp/dankogai/archives/50462995.html"&gt;perlの例&lt;/a&gt;を見ると&lt;strong&gt;を～&lt;/strong&gt;とか思う。&lt;/p&gt;
&lt;p&gt;変数の代入をIOと考えればtieって参照透明性を確保しつつ、副作用を発生させることができるのね。この場合にいわゆる&lt;a href="http://www.sampou.org/haskell/a-a-monads/html/laws.html"&gt;モナド則&lt;/a&gt;は成り立つのかなと考えてみたけど、なんとなく成り立つのかなと思ったり。&lt;/p&gt;
&lt;p&gt;と、ここらへんまで理解した気になって、再度ふつうのhaskellを。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41mJTrvw2pL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    青木 峰郎&lt;br /&gt;
    ソフトバンククリエイティブ / 2940円 ( 2006-06-01 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;なんとなくわかってキテルっぽいが、じゃぁ、MaybeモナドとかListモナドって何なのヨっていうか、モナドって一体何さ?っていうあたりがわからなくなってきた。さらにperlのtieなんかで実装できるってことは、モナド則っていうのは結局なんなのってのがよくわからん。&lt;/p&gt;
&lt;p&gt;ふつうのhaskellに&lt;br /&gt;
&lt;strong&gt;モナドを定義の観点からみるならばモナド則がすべて&lt;/strong&gt;&lt;br /&gt;
とあるように、モナド則を感覚で理解しなければならんのかな。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sampou.org/haskell/a-a-monads/html/" title="All About Monads"&gt;All About Monads&lt;/a&gt;
&lt;blockquote&gt;ほんとうにモナドを理解するには、モナドを使ったコードを経験することが最良 の方法です。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;というわけで、コードを書こう。&lt;/p&gt;</description><pubDate>Mon, 25 Sep 2006 22:32:35 +0900</pubDate><category>haskell</category></item><item><title>haskellだとフィボナッチ数列を表現すればいいのか</title><link>http://blog.kzfmix.com/entry/1155981301</link><description>&lt;p&gt;コメントで&lt;a href="http://blog.kzfmix.com/entry/1155217451"&gt;haskellでフィボナッチ&lt;/a&gt;の別解をもらったが、パッと見てもなぜこれでフィボナッチ数列ができるのかいまいちわからんかったので、よく読んでみたヨ。&lt;/p&gt;
&lt;p&gt;まずは型チェック。
見ればわかるとおりfibはリストを返す関数ですな。つまり、fibを実行するとフィボナッチ数がどんどこどんどことそれこそとめどなく溢れてくる(はず)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Num&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;zipWith&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;これを　fib.hsという名前で保存してghciで実行してみる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ghci&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hs&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;をを～。凄い勢いでフィボナッチ数列がどんどこど(以下略)。ちなみにlengthでリストの長さをはかってみると、プロンプトがかえってこないゾ。さすが無限リスト。&lt;/p&gt;
&lt;p&gt;zipWithの型とtailの型はこんな感じ。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Prelude&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;zipWith&lt;/span&gt;
&lt;span class="n"&gt;zipWith&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Prelude&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;
&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;zipWithは高階関数で、+関数をfibとtail fibに適用して新しいリストをつくるわけですな。tailは先頭の要素を取り除いたリストを返す関数だから、、、うーんやってることはわかるんだけど、イマイチイメージできん。&lt;/p&gt;
&lt;p&gt;と悩んでたら、&lt;a href="http://ja.wikipedia.org/wiki/Haskell"&gt;Wikipediaに書き下されてる表&lt;/a&gt;をみつけて納得した。perlで同じことやろうとするとまず有限個の要素をもつ配列があってみたいなところから始まるから、こういう表現はできないな。というわけで、目からうろこっていうか、ちょっと感動した。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1155217451"&gt;ここ&lt;/a&gt;で考えたような&lt;strong&gt;n-1番目とn番目のフィボナッチ数が与えられたときにn+1番目のフィボナッチ数を求めるということを考えるのではなくて、そもそもフィボナッチ数列とは何かを考えて、それを無限リストとして表現することを考えればよいんですよ&lt;/strong&gt;と。&lt;/p&gt;
&lt;p&gt;となると、リスト内包表記も感動するような綺麗さダ。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;fibs &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; : &lt;span class="m"&gt;1&lt;/span&gt; : &lt;span class="p"&gt;[&lt;/span&gt; a&lt;span class="o"&gt;+&lt;/span&gt;b &lt;span class="o"&gt;|&lt;/span&gt; a &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; fibs &lt;span class="o"&gt;|&lt;/span&gt; b &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; tail fibs &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/Haskell" title="Haskell - Wikipedia"&gt;Haskell - Wikipedia&lt;/a&gt;
&lt;blockquote&gt;GHCの並列リスト内包表記(GHCの拡張は特別なコマンドラインフラグによって有効にしなければならない。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;とあるのが、なにが問題なんだかわからんので、とりあえず実行してやろう。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fib4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hs:1:15:&lt;/span&gt; &lt;span class="n"&gt;Illegal&lt;/span&gt; &lt;span class="n"&gt;parallel&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;comprehension:&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fglasgow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exts&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt; &lt;span class="n"&gt;loaded:&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;デフォルトだと、同じリストが複数でてくるような表記の仕方(この場合はfibs)は問題あるということなのかな&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;ghci&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fglasgow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exts&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;とオプションを指定して実行することで、OK。をを～。凄い勢いでフィボナッチ数列がどんどこど(以下略)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;haskell素敵過ぎ&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Sat, 19 Aug 2006 18:55:01 +0900</pubDate><category>haskell</category></item><item><title>haskellでフィボナッチ そしてPerlで書いてみた</title><link>http://blog.kzfmix.com/entry/1155217451</link><description>&lt;p&gt;普通のhaskellプログラミングを読み終えて、なんか次に読むものないかなと探していたら、&lt;a href="http://web.archive.org/web/20030814121222/http://www.teu.ac.jp/kougi/koshida/Prog6/index.html"&gt;webarchiveに面白そうなページがある&lt;/a&gt;ことを知ったので、ダウンロードして読んでます。&lt;/p&gt;
&lt;p&gt;3回目の講義資料に、タプルを使って高速にフィボナッチ数を計算する話があったので、なんでそうなるのかを理解するために手で書き下してみた。&lt;/p&gt;
&lt;p&gt;普通に書くとこんな感じ(fib)。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fact&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt;
&lt;span class="n"&gt;fact&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;書き下すと、計算量があっという間に増えていくことがわかる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;タプルを使った例(fastfib)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;フィボナッチ数列を効率良く計算する方法を考えよう．前に見たとおり，フィボナッチ数列の各項は，その前の二つの項の和である．逆に言えば，二つの連続した項の値が与えられれば，次の項を計算するのは簡単なのだ．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;otherwise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fastFib&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt;
&lt;span class="n"&gt;fastFib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;fibPair&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;コードを眺めただけではなんで速くなるのか実感がわかなかったので、書き下してみる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;fastFib&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;をを、タプルにすることで、計算量が減ってます、自分で展開していくとなるほどとよくわかる。&lt;/p&gt;
&lt;p&gt;さて、最近Higher-order Perlを読んでいる僕としては、これをperlで書いてみたくなるわけである。&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;fibStep&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;fibPair&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$fs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$fp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$fs&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$fs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$fp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;fastFib&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fibStep&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;\&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fibPair&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fib_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$fp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$fs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$fp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$fib_num&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;fastFib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;サブルーチンのリファレンスを引数にとらないといけないのがhaskellと異なるとこかな。あとは書いてて思ったのは関数の型を書くとプログラムの流れが理解しやすいナァと。&lt;/p&gt;
&lt;p&gt;実行すると一瞬で計算が終わる（速い!）&lt;/p&gt;
&lt;p&gt;実際に処理の流れを追うために-dオプションを付けて実行してsを連打すると、main::fibPairがどんどん実行されて$nが0になったところで今度はmain::fibStepが次々実行されていく様がわかる。&lt;/p&gt;
&lt;p&gt;Higher-order Perlの5章にもフィボナッチ数列のことが書いてあるのだが、まだそこまで読み進めていない。(今3章突入したところ)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1558607013/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41amviSk6nL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Higher-Order Perl: Transforming Programs with Programs&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    Mark Jason Dominus&lt;br /&gt;
    Morgan Kaufmann / 6402円 ( 2005-03-28 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41mJTrvw2pL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    青木 峰郎&lt;br /&gt;
    ソフトバンククリエイティブ / 2940円 ( 2006-06-01 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;haskellを勉強しながら、Higher-order Perlを読むと、色々新たな発見があって楽しい。&lt;/p&gt;</description><pubDate>Thu, 10 Aug 2006 22:44:11 +0900</pubDate><category>perl</category><category>haskell</category></item><item><title>Meadowでhaskellモード</title><link>http://blog.kzfmix.com/entry/1153401718</link><description>&lt;p&gt;ふつうのHaskellプログラミングも、とうとう第三部のWIKIをつくろうの章に突入。&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41mJTrvw2pL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    青木 峰郎&lt;br /&gt;
    ソフトバンククリエイティブ / 2940円 ( 2006-06-01 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;でも、第三部は実際のコードのポイントだけ解説なので、&lt;a href="http://www.loveruby.net/ja/stdhaskell/"&gt;サポートページ&lt;/a&gt;からコードをダウンロードしてきてつきあわせながら読む感じになるので、Meadowでソースコードを開いて本を読んでる。&lt;/p&gt;
&lt;p&gt;で、perlとか&lt;a href="http://blog.kzfmix.com/entry/1145630738"&gt;javascript&lt;/a&gt;は色がついてて見やすいのに、、、Meadowにhaskellモードってないのかなぁと思って探したら&lt;a href="http://oss.timedia.co.jp/index.fcgi/kahua-web/show/Haskell/Emacs"&gt;あった&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;これでかなりコードが読みやすくなった。&lt;/p&gt;
&lt;p&gt;あと本を最後まで読んでみての感想だが、ふつうのHaskellプログラミングは一部、二部と三部の具体事例の間にはかなり開きがあるような気がした。二部と三部の間に数学的な問題を事例として扱う部もあったほうがいいような。&lt;/p&gt;
&lt;p&gt;というわけで、&lt;a href="http://www.sampou.org/haskell/ipsj/"&gt;「連載: Haskellプログラミング」&lt;/a&gt;なんかを読んで解くといいかもしれん。&lt;/p&gt;</description><pubDate>Thu, 20 Jul 2006 22:21:58 +0900</pubDate><category>Meadow</category><category>haskell</category></item><item><title>モナドで躓く</title><link>http://blog.kzfmix.com/entry/1152624865</link><description>&lt;p&gt;ふつうのHaskellプログラミングも、とうとう11章へ。中盤も佳境をむかえております。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41mJTrvw2pL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    青木 峰郎&lt;br /&gt;
    ソフトバンククリエイティブ / 2940円 ( 2006-06-01 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;モナドが～～&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;わかりません、さっぱり。他の言語での例があったので少し読んでみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/m-hiyama/20060419/1145432492"&gt;http://d.hatena.ne.jp/m-hiyama/20060419/1145432492&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.livedoor.jp/dankogai/archives/50462995.html"&gt;http://blog.livedoor.jp/dankogai/archives/50462995.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/m-hiyama/20060419/1145432492" title="檜山正幸のキマイラ飼育記 - 世界で一番か二番くらいにやさしい「モナド入門」"&gt;檜山正幸のキマイラ飼育記 - 世界で一番か二番くらいにやさしい「モナド入門」&lt;/a&gt;
&lt;blockquote&gt;振り返れば我々は； 関数から副作用を取り除き（汚れ作業はCountupMainに押しつけ）、代わりに戻り値に副作用の意図を詰め込み、それによって失われた関数結合の自由さを関数の拡張により取り戻しました。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;javascriptもperlのコードもなんとなくわかったような気にはなったんだけど、ふつうのHaskellプログラミングに戻ると混乱してしまうヨ。&lt;/p&gt;
&lt;p&gt;週末にでも幾つかコードを書いてみてよく考えることにしよう。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://del.icio.us/kzfm/haskell"&gt;http://del.icio.us/kzfm/haskell&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 11 Jul 2006 22:34:25 +0900</pubDate><category>perl</category><category>haskell</category></item><item><title>HaskellでBioinformatics</title><link>http://blog.kzfmix.com/entry/1151931415</link><description>&lt;p&gt;本日普通のHaskellプログラミングの7章まで読み終えた。そろそろ、具体的な例題解いてみたいなぁと思ったが、3部13章のWIkiをつくってみようの章まではあと5つもある。今のとこ、ここまで読んで、実用Perlプログラミングみたいに他の言語との違いみたいなページを割いてくれるとよかったりと思った。それ以外は、unixのコマンドをtailとかheadとかをhaskellで書こうみたいな感じにすすむので理解はしやすいヨ。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41mJTrvw2pL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    青木 峰郎&lt;br /&gt;
    ソフトバンククリエイティブ / 2940円 ( 2006-06-01 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;実際に、どんな感じの問題に適用すんのがいいのかなぁとか、考えたときに、ゲノムみたいな大きい配列操作すんのに適してるも。もしかしてbioinformaticsでなんかあるかなと探したらあった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ii.uib.no/~ketil/bioinformatics/"&gt;http://www.ii.uib.no/~ketil/bioinformatics/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://biowiki.org/BioHaskell"&gt;http://biowiki.org/BioHaskell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;論文あったのでアブスト眺めたけど、DPってhaskell向きなのかな？まだ、いまいちわかってなさげ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www-06.ibm.com/jp/developerworks/linux/060303/j_l-r3.shtml"&gt;Rによる統計的プログラミング&lt;/a&gt;
でRと比較しているのだから統計的な(というより数学的な)記述にむいているのは感覚的にわかるんだけどなぁ。&lt;/p&gt;
&lt;p&gt;ということはchemoinformaticsでの利用例あるだろ、とか思うんだが見当たらない。&lt;/p&gt;</description><pubDate>Mon, 03 Jul 2006 21:56:55 +0900</pubDate><category>haskell</category><category>r</category><category>Biohaskell</category></item><item><title>perlで高階関数とカリー化</title><link>http://blog.kzfmix.com/entry/1151245630</link><description>&lt;p&gt;先週は電車通勤+歩きで仕事場を行き来したので、電車の中で、&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000BQT6XK/ref=nosim/kaerutyuuihou-22"&gt;英語漬け&lt;/a&gt;で英語のトレーニングしてみたり、&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;普通のHaskellプログラミング&lt;/a&gt;読んだりと、電車通勤はなかなか有意義なことに気付かされた。特に&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797336021/ref=nosim/kaerutyuuihou-22"&gt;普通のHaskellプログラミング&lt;/a&gt;は第一部を読み終えたことで、&lt;strong&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%B9%E2%B3%AC%B4%D8%BF%F4"&gt;高階関数&lt;/a&gt;&lt;/strong&gt;と&lt;strong&gt;変数の束縛&lt;/strong&gt;というものがわかったような気がした?&lt;/p&gt;
&lt;p&gt;、、、、したのかどうかまだよくわからんので、自分の理解力を認識するために少し書いてみた。&lt;/p&gt;
&lt;p&gt;まず、言葉の定義を。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;変数の束縛&lt;/li&gt;
&lt;li&gt;(例えば)関数という値があり、それが変数名を束縛している&lt;/li&gt;
&lt;li&gt;高階関数&lt;/li&gt;
&lt;li&gt;関数を返したり引数にとったりする関数&lt;/li&gt;
&lt;li&gt;変数が関数に束縛されているから、関数を変数として扱うことが出来る?&lt;/li&gt;
&lt;li&gt;それとも関数を変数として扱うことことが出来れば高階関数はつくれるのか?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;perlでも変数を束縛することが出来れば高階関数など扱えるのかなと。クロージャ使えってことか？と思って調べて見ると面白そうなのが。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/naoya/20060109/1136812096"&gt;http://d.hatena.ne.jp/naoya/20060109/1136812096&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/tociyuki/20051022/1129952410"&gt;http://d.hatena.ne.jp/tociyuki/20051022/1129952410&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/palmo/20060509/curry"&gt;http://d.hatena.ne.jp/palmo/20060509/curry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://torus.jp/memo/x200509/perl_higher_order_xml.rd.html"&gt;http://torus.jp/memo/x200509/perl_higher_order_xml.rd.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（って全部一度は見たことあるじゃん。でもワカンネとか言って放り出した気が、、、、）&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/palmo/20060509/curry"&gt;ぱるも日記&lt;/a&gt;ではカリー関数を作る例が示されていたが、関数を返す高階関数の例ですな。カリー化に関しては、&lt;a href="http://www.chimaira.org/docs/AlgebrasCoalgebras.htm"&gt;これ&lt;/a&gt;など面白かった。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://torus.jp/"&gt;torus solutions!&lt;/a&gt;は僕がblosxomをいじくるときにかなり参考にさせてもらったサイトです。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://torus.jp/memo/x200509/perl_higher_order_xml.rd.html" title="XML を Perl の高階関数で。 : torus solutions!"&gt;XML を Perl の高階関数で。 : torus solutions!&lt;/a&gt;
&lt;blockquote&gt;XML::LibXML で XML を作るときに、 いちいち createElement とか appendChild とか書くのに飽きてきたので、 高階関数版を作ってみた。&lt;/blockquote&gt;
これも、関数を返すといってよいのでしょう。&lt;/p&gt;
&lt;p&gt;関数を引数にとる高階関数をperlで書けるのだろうか？というのが気になるところだが、関数のリファレンスを引数にとる関数を書けばいいのかなと思ってこれまた調べてみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/cranebird/20060308/1141829356"&gt;http://d.hatena.ne.jp/cranebird/20060308/1141829356&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここまでの関数を返す関数とか関数を引数にとる関数を考えると、perlでの(関数による)変数の束縛ってのは、関数のリファレンスを変数として扱うことでなされると考えてよいのかな。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1558607013/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41amviSk6nL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Higher-Order Perl: Transforming Programs with Programs&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    Mark Jason Dominus&lt;br /&gt;
    Morgan Kaufmann / 6402円 ( 2005-03-28 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Higher-order Perlも気になる&lt;/p&gt;</description><pubDate>Sun, 25 Jun 2006 23:27:10 +0900</pubDate><category>perl</category><category>haskell</category></item></channel></rss>
