<?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>ものぐさ備忘録 &#187; Haskell</title>
	<atom:link href="http://www.ginriki.net/wd/category/haskell/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 16 Jan 2011 20:07:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Debug.Traceを使ってprintf風デバッグ</title>
		<link>http://www.ginriki.net/wd/2007/07/13/25/</link>
		<comments>http://www.ginriki.net/wd/2007/07/13/25/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 18:13:15 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=25</guid>
		<description><![CDATA[
Haskell処理系であるGHCにはDebug.Traceモジュールというのが提供されています*1。その中のtrace関数を使うと、C言語のおけるprintfデバッグのようなことができます。
ただ、Haskellは遅延 [...]]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>Haskell処理系であるGHCにはDebug.Traceモジュールというのが提供されています<span class="footnote"><a href="/gikogeek/#f1" name="fn1" title="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html :traceの実装自体は難しくないそうなので、他の処理系でも同じようなモジュールがあるかもしれません">*1</a></span>。その中のtrace関数を使うと、C言語のおけるprintfデバッグのようなことができます。</p>
<p>ただ、Haskellは遅延評価を行う言語なので、traceが呼び出されるタイミングに注意する必要があるそうです。</p>
<p>以下、参考元サイト</p>
<ul>
<li>trace関数の使い方
<ul>
<li> <a href="http://www.sampou.org/cgi-bin/haskell.cgi?Trace" target="_blank">http://www.sampou.org/cgi-bin/haskell.cgi?Trace</a></li>
</ul>
</li>
<li>trace関数を使う際の注意点について
<ul>
<li> <a href="http://haskell.g.hatena.ne.jp/jmk/20070706/1183688102" target="_blank">http://haskell.g.hatena.ne.jp/jmk/20070706/1183688102</a></li>
</ul>
</li>
</ul>
</div>
<div class="footnote">
<p class="footnote"><a href="/gikogeek/#fn1" name="f1">*1</a>：<a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html" target="_blank">http://www.haskell.org/ghc/docs/latest/html/libraries/base/Debug-Trace.html</a> :traceの実装自体は難しくないそうなので、他の処理系でも同じようなモジュールがあるかもしれません</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2007/07/13/25/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskellだってバグるよねっていう話し（Ｃ言語の関数をHaskellで呼ぶ）</title>
		<link>http://www.ginriki.net/wd/2007/07/09/24/</link>
		<comments>http://www.ginriki.net/wd/2007/07/09/24/#comments</comments>
		<pubDate>Sun, 08 Jul 2007 21:44:59 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[FFI]]></category>
		<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=24</guid>
		<description><![CDATA[
C言語の関数をHaskellから呼び出すための記述に関する仕様が存在します*1
自分が使っているHaskell処理系のGHCは、この仕様に準拠しています。そこで、この機能を使ってバグったC関数をHaskellから呼ぶこ [...]]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>C言語の関数をHaskellから呼び出すための記述に関する仕様が存在します<span class="footnote"><a href="/gikogeek/#f1" name="fn1" title="http://www.cse.unsw.edu.au/~chak/haskell/ffi/ffi.pdf">*1</a></span></p>
<p>自分が使っているHaskell処理系のGHCは、この仕様に準拠しています。そこで、この機能を使ってバグったC関数をHaskellから呼ぶことでメモリアクセス違反させてみます<span class="footnote"><a href="/gikogeek/#f2" name="fn2" title="このコードを書く際には、こちらの日記を参考にさせていただきました。http://d.hatena.ne.jp/E_Mattsan/20070616">*2</a></span>。</p>
<pre class="syntax-highlight">
<span class="synComment">// foo.c</span>
<span class="synPreProc">#include </span><span class="synConstant">&#34;HsFFI.h&#34;</span>

<span class="synType">static</span> <span class="synType">int</span> mem;

HsPtr wrong_ptr(<span class="synType">int</span> wrong)
{
<span class="synStatement">if</span>(wrong){
<span class="synStatement">return</span> (HsPtr)<span class="synConstant">0xcfcfcfcf</span>;
}<span class="synStatement">else</span>{
<span class="synStatement">return</span> (HsPtr)
}

}
</pre>
<p>このwrong_ptr関数を呼ぶHaskellコードは以下、</p>
<pre class="syntax-highlight">
-- main.hs

import Foreign

foreign import ccall &#34;wrong_ptr&#34; wrong_ptr :: Int -&#62; IO (Ptr Int32)

main = do
ptr &#60;- wrong_ptr 0            -- 変数memのアドレスがptrを束縛する
pokeElemOff ptr 0 5           -- ptr[0] = 5
peekElemOff ptr 0 &#62;&#62;= print   -- 5を出力

ptr &#60;- wrong_ptr 1            -- 0xcfcfcfcfがptrを束縛する
pokeElemOff ptr 0 100         -- メモリアクセス違反!!!
peekElemOff ptr 0 &#62;&#62;= print
</pre>
<p>で、実際にやってみると、<span class="footnote"><a href="/gikogeek/#f3" name="fn3" title="WindowsにmsiパッケージからGHCをインストールした場合、cc1が存在しないっていわれますが、C:/ghc/ghc-6.6.1/gcc-libにPATHを通せば動きます（GHC6.6.1をデフォルトのパスにインストールした場合） ">*3</a></span></p>
<pre class="syntax-highlight">
<span class="synStatement">&#62;</span> ghc foo.c main.hs <span class="synSpecial">-ffi</span> <span class="synSpecial">-o</span> foo
<span class="synStatement">&#62;</span> foo
<span class="synConstant">5</span>
<span class="synStatement">&#60;</span>------ここで異常終了
<span class="synStatement">&#62;</span>
</pre>
<p>この例はわざとらしいですが、Haskellのプログラムも、わかりにくいタイプのバグが入り込む余地があるっていうことがわかると思います。</p>
<p>C言語の関数を使わなきゃ良いっていう意見もあると思いますが、win32apiやらLinux等のシステムコールを直に扱いたい時には使わざる得ないでしょう<span class="footnote"><a href="/gikogeek/#f4" name="fn4" title="win32apiは、ある程度Haskellの標準ライブラリとして用意されてるようです">*4</a></span>。</p>
<p>また、絶対にC言語の関数を使わないっていうスタンスは、既存のライブラリを使ったほうが楽なのに、わざわざHaskellで書き直さなきゃいけないといった問題が発生する点でコストが高いと思います。</p>
<p></p>
<p>個人的には、デバッグ周辺のツールがもう少し充実しないと、普通のプログラムを書くのにHaskellを使う気になれません。上の例よりもっと複雑なコードがバグった時のデバッグ作業を考えると恐ろしすぎます。</p>
<p>GHC6.7からはデバッガが付属するそうなので、正式にリリースされたら使ってみようと思います。</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/gikogeek/#fn1" name="f1">*1</a>：<a href="http://www.cse.unsw.edu.au/~chak/haskell/ffi/ffi.pdf" target="_blank">http://www.cse.unsw.edu.au/~chak/haskell/ffi/ffi.pdf</a></p>
<p class="footnote"><a href="/gikogeek/#fn2" name="f2">*2</a>：このコードを書く際には、こちらの日記を参考にさせていただきました。<a href="http://d.hatena.ne.jp/E_Mattsan/20070616" target="_blank">http://d.hatena.ne.jp/E_Mattsan/20070616</a></p>
<p class="footnote"><a href="/gikogeek/#fn3" name="f3">*3</a>：WindowsにmsiパッケージからGHCをインストールした場合、cc1が存在しないっていわれますが、C:/ghc/ghc-6.6.1/gcc-libにPATHを通せば動きます（GHC6.6.1をデフォルトのパスにインストールした場合） </p>
<p class="footnote"><a href="/gikogeek/#fn4" name="f4">*4</a>：win32apiは、ある程度Haskellの標準ライブラリとして用意されてるようです</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2007/07/09/24/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell本の感想とMonad</title>
		<link>http://www.ginriki.net/wd/2007/07/09/23/</link>
		<comments>http://www.ginriki.net/wd/2007/07/09/23/#comments</comments>
		<pubDate>Sun, 08 Jul 2007 21:44:58 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=23</guid>
		<description><![CDATA[
教養のために「ふつうのHaskellプログラミング」を読みました。Haskellを触ったことがない私のような人が読むのにちょうど良い本でした。
ただ、Monad則については読んでも良くわかりませんでした。Maybeモナ [...]]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>教養のために「ふつうのHaskellプログラミング」を読みました。Haskellを触ったことがない私のような人が読むのにちょうど良い本でした。</p>
<p>ただ、Monad則については読んでも良くわかりませんでした。Maybeモナド等、Monadインスタンスの使い方はわかるのですが、Monad則がどのようにして出てきて、どんな利点があるのか等の理論的な部分はページ量の関係か本に詳しく書いてありません。</p>
<p>そこで、Monadについて解説しているWebサイトを探して読んでみましたが、いまいち理解できてません。</p>
<p>ただ、IO処理等の副作用を持つ操作にMonadが利用できる理由については、以下のサイトを読むとなんとなくわかった気になれます。</p>
<ul>
<li><a href="http://www.kmonos.net/wlog/65.html#_1549060908" target="_blank">http://www.kmonos.net/wlog/65.html#_1549060908</a></li>
<li><a href="http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO" target="_blank">http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO</a></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2007/07/09/23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

