Planet TLUG

January 27, 2012

Pietro Zuco

Kimura Osamu

[Haskell] Coduitのトリビアルでシンプルなサンプル

Haskellの新しいIOライブラリのトリビアルなサンプルを書きました。

Conduitとは、水道管とか溝とか言う意味です。

この例は読み込みと書き込みのファイルを開いて10文字だけコピーするだけのサンプルです

do構文で組み立てられたResourceTモナドをrunResourceで実行とモナド変換を行います

このdo構文の中は大まかに分けて3つとなります。

  • リソースの確保
  • パイプ処理
  • リソース開放

リーソスの確保

(srcKey, rHandle) <- with (openFile src $ ReadMode) $ hClose 

withを使ってリソースを確保します。

withの第一引数が確保。第二引数が開放のためです。

それぞれコンストラクタとデストラクタのようなものです。

withの返り値はタプルとなっています。このタプルの一番目がキーとなっており開放のために使います。二番目はハンドルとなっており、パイプ処理の時にSource,Sinkに変換して使います。

with定義
withSource
:: Resource m => Base m aallocate
-> (a -> Base m ())free resource
-> ResourceT m (ReleaseKey, a)


パイプ処理

ResourceTを組み立てる必要があります。

そのために

source -> conduit -> sink

(unixの例えでばよけばcoduitはパイプ"|")

というパイプを作り必要があります。

この例の場合

(sourceHandle rHandle) $= (isolate 10) $$ sinkHandle wHandle

該当箇所となります。

  • source
sourceHandle rHandle
sourceHandle定義
sourceHandle :: ResourceIO m => Handle -> Source m ByteString
  • conduit
(isolate 10)
  • sink
sinkHandle wHandle
sinkHandle定義
sinkHandle :: ResourceIO m => Handle -> Sink ByteString m ()

となります

sourceHandle, sinkHandleはそれぞれハンドルをsource、sinkに変換する関数です。

($=)演算子はConduitを結合するための演算子です。

こうして作られたパイプコンビネータ($$)ResourceT組み立てます。

isolate定義
isolate :: Resource m => Int -> Conduit ByteString m ByteString
($$) 定義
($$) :: (IsSource src, Resource m) => src m a -> Sink a m b -> ResourceT m b
($=)定義
($=) :: (IsSource src, Resource m) => src m a -> Conduit a m b -> Source m b

リソース開放

リソースの開放release関数を使って行われます

release srcKey
release定義
release :: Resource m => ReleaseKey -> ResourceT m ()

by oskimura at January 27, 2012 03:50 AM