Home About
データ変換を Writer Monad 的に処理する その4

前回のエントリーのコードを引き継いで、 もし処理対象のデータに重複があったらどのように対処するか考えてみます。

» Read More
データ変換を Writer Monad 的に処理する その3

前回のエントリーの コードを見直しある意味もう少しシンプルに実装してみます。

» Read More
データ変換を Writer Monad 的に処理する その2

今回は 前回のエントリーで実装した Writer を引き続き使って、 より実践的な例でこれがどのように便利かを説明します。

» Read More
データ変換を Writer Monad 的に処理する その1

たとえば価格改定などで、昨年と今年の価格表がエクセルデータとして支給される。 そして、それを商品ごとにマージして、最新の価格表を提出せよ、 といったタスクがあったとする。

このとき、商品ごとにキーとしての id が設定されているわけでもなく 商品名が一致したら同じ商品として扱うという雑な仕様。 そして、入力ミスにより微妙に商品名が昨年と今年で異なるものが含まれてもいるのだが、 同じ商品として扱ってほしいと言われたりする。

さらに価格が値下がりしている商品があるのだが、それらは価格入力をミスしている恐れがあるので、 そういう場合は警告しなければならない。などなど。 このような状況で、昨年と今年のデータをマージして最新の商品価格情報を作り出す必要がある場合に、 Writer Monad があれば心強い ですよ、という話です。

» Read More
Haskell / コーヒーメニューの価格改訂リストの作成 改善版

Writer モナドを使ったコーヒーメニューの価格改訂リストの作成 の改善版をつくります。 新旧のアイテムリストから、同じコーヒー名を持つアイテムを組み合わせたタプルをつくる方法を改善します。 →2つのリストの要素を組み合わせたい(リストモナド)

» Read More
Haskell / 2つのリストの要素を組み合わせたい(リストモナド)

新旧2つのコーヒーメニューアイテムリストがあり、 そこから同じコーヒー名をもつ新旧アイテムの組み合わせをつくりたい、という問題を考える。

ひとつの方法(方法A)は、ユニークなコーヒー名リストを作成し、 それを使って、新旧2つのリストからそのコーヒー名を持つアイテムを取り出し、新旧アイテムをタプルにする。

もうひとつの方法(方法B)は、新旧2つのコーヒーメニューアイテムリストの各要素ごとの 全ての組み合わせを生成しておき、 その中かから、新旧のアイテムでコーヒー名が一致している組み合わせだけを残す。

方法Aは発想としては分かりやすいけれども、もしひとつのリスト内に同じコーヒー名を持つアイテムが含まれていると困る。 その場合を考慮してコードをかけばよいのだろうけれど、ややこしい気がする。

» Read More
Haskell / Writer モナドを使ったコーヒーメニューの価格改訂リストの作成

Writer モナドの使用例として その1 / その2 / その3 とエントリーを書いたのだが、気に入らない。 結局 Writer モナドを使う必要のないコードになってしまった。

今回はその1〜3のコードをリファクタリングして、Writer モナドを使うべき理由のあるコードに直します。

» Read More
Haskell / 二つの Maybe Int の数値を比較したい

たとえば、コーヒーメニューアイテムの名前とその価格があったときに、値段が高い方を取り出したい、とする。 ただし、価格が不明なアイテムもあるので、価格の型は Mayb Int になっている。 それらを上手に取り扱いたい場合を考える。

» Read More
Haskell / Maybe a から a を取り出す maybe 関数

たとえば Maybe String から String だけを取り出したい場合。 maybe 関数を使えばよい。

» Read More
Haskell / Writer モナドを使ったより実践的なコード(その3)

前回はエラーのある入力データを用意して、それを処理できるようにしました。 今回は、ようやく本題の Writer モナドを使ってエラーの内容を付加する機能をコードします。

» Read More
Haskell / Writer モナドを使ったより実践的なコード(その2)

前回は入力データにエラーがない場合を想定したコードでした。 今回はデータにエラーが含まれていた場合について考えます。 エラーが含まれていても作動するようにするだけでなく、どんなエラーなのかの説明(ログ)を同時に追加します。

» Read More
Haskell / Writer モナドを使ったより実践的なコード(その1)

Writer についてこのエントリーで軽く使い方を調べました。 今回はコーヒーの価格改訂を題材にして Writer モナドを使ってみます。

ここでは次のようなケースについて考えてみます。

以下の3つのコーヒーメニューアイテムがあるとします。

これらが事情により値上げとなり、以下のようになったとします。

そこで改訂前と後の価格がアイテムごとに把握できるデータを作成します。

方針として、まずはデータにエラーが含まれていないケースについて考えます(その1)。 その後データにエラー(不備等)があった場合に対処できるコードを Writer モナドを使って書くことにします(その2)。

» Read More