ListT
fromを使用できます。これは、この場合に正しいことを行うpipes
lazy のより安全な代替手段を提供します。IO
失敗する可能性のある画像の遅延ストリームをモデル化する方法は次のとおりです。
imageStream :: ListT IO (Maybe Image)
次のタイプの画像読み込み機能があると仮定します。
loadImage :: FileName -> IO (Maybe Image)
..そのようなストリームを構築する方法は次のようになります。
imageStream = do
fileName <- Select $ each ["file1.jpg", "file2.jpg", "file3.jpg"]
lift $ loadImage fileName
dirstream
ライブラリを使用すると、ディレクトリの内容を遅延ストリーミングすることもできます。
成功した結果のみを除外する関数には、次のタイプがあります。
flattenImageStream :: (Monad m) => ListT m (Maybe a) -> ListT m a
flattenImageStream stream = do
ma <- stream
case ma of
Just a -> return a
Nothing -> mzero
この関数は、任意の基本モナドに対して機能することに注意してくださいm
。それについて特定のものは何もありませんIO
。怠惰も保ちます!
に適用するflattenImage
とimageStream
、次のようなものが得られます。
finalStream :: List IO Image
finalStream = flattenImage imageStream
次に、これらの画像を使用する次のタイプの関数があるとします。
useImage :: Image -> IO ()
関数ListT
を使用してファイナルを処理する場合は、次のように記述します。useImage
main = runEffect $
for (every finalStream) $ \image -> do
lift $ useImage image
これにより、画像ストリームが遅延して消費されます。
もちろん、コード ゴルフをプレイして、そのすべてを次のはるかに短いバージョンに結合することもできます。
main = runEffect $ for (every image) (lift . useImage)
where
image = do
fileName <- Select $ each ["file1.jpg", "file2.jpg", "file3.jpg"]
maybeImage <- lift $ loadImage fileName
case maybeImage of
Just img -> return img
Nothing -> mzero
fail
の定義を追加して、次のListT
ように書けるようにすることも考えています。
main = runEffect $ for (every image) (lift . useImage)
where
image = do
fileName <- Select $ each ["file1.jpg", "file2.jpg", "file3.jpg"]
Just img <- lift $ loadImage fileName
return img