Home About
Kotlin Sealed クラスを使った Maybe の実装

Kotlin の Sealed クラスを使えば、 代数データ型の直和型を表現できる、という情報を得たので、MaybePokemon クラスをつかって試してみた。

» Read More
微妙に揺れのある2つの文字列リストの差(difference)の計算 Haskell 編

前回のエントリー微妙に揺れのある2つの文字列リストに対する積集合(Intersection)と差集合(difference)の計算 の Haskell 編です。

積集合と差集合とか書いて・・・途中で気づいたのですが、2つの集合の差だけを求めれば済む話だった。 Haskell 編では差だけを求めます。

» Read More
Haskell / 再帰関数を foldl または foldr に直す

コーヒーメニューの価格改訂リストの作成で書いた再帰関数をリファクタリングします。

» Read More
Haskell / コーヒーメニューの価格改訂リストの作成 エクセルデータからの読み書き対応(書き出し編)

コーヒーメニューの価格改訂リストの作成の後編です。 読み取った新旧のコーヒーメニューリストをコーヒー名をキーにマージして旧価格/新価格を一覧にします。 また、エラーが含まれていたらログも書き出します。

» Read More
Haskell / コーヒーメニューの価格改訂リストの作成 エクセルデータからの読み書き対応(読み取り編)

新旧二つのコーヒーメニューアイテムリストデータを元に価格改訂データを作成する。 今度は入力データをエクセルデータにして、結果をエクセルデータとして書き出します。

Old and New Items

» 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
Haskell xlsx を使ってエクセルデータの読み書き パート3

今回は xlsx モジュールを使って、エクセルデータを書き出します。 前回 までにエクセルデータの読み取りと Computer 型への変換まで行ったので、 今回はその結果をエクセルデータとして書き出します。

» Read More
Haskell xlsx を使ってエクセルデータの読み書き パート2

前回 に続いてのパート2 です。

前回作成したエクセルデータを読み込むコードをモジュールにした上で、ボディ行を Computer 型に変換するところまで実装します。

» Read More
Haskell xlsx を使ってエクセルデータの読み書き パート1

xlsx モジュールを使って、エクセルデータの読み書きを試します。

処理内容は、エクセルデータからコンピュータリストを読み取り、所定の条件にマッチした情報のみをエクセルデータとして書き出すことにする。

Computers

» Read More
Haskell / ポケモンのモデル化とその進化 Monad による連続変換処理(その2)

前回 ポケモンのモデル化とその進化を Maybe モナドと bind を使って記述しました。 変換処理を連続で適用するという意味では、前回の段階では、コードが読みやすくなった程度で モナドを使う利点がさほどない状態でした。 今回は、ポケモン進化モデルのルールを追加し、モナドを使ううれしさを探ってみます。

» Read More
Haskell / ポケモンのモデル化とその進化 Monad による連続変換処理(その1)

Haskell で練習のため キャタピー進化系のモデル化をやってみます。 Maybe Monad を使ってトレーニングとバトルでゲットしたキャタピーを進化させよう。

» Read More
Haskell / 型クラスを定義して 関数名のバッティングを回避する

data とそのフィールド値の取得 でポケモン型を使いました。

そのとき疑問に思ったのが、 たとえば Pokemon をレコード構文で定義した場合に ポケモン型からその名前を取得するのに name aPokemon のようにすれば ポケモン名が取得できることがわかったのですが、name のような、よくありがちな関数名を使えるようにしたら、困るのでは?ということです。

つまり、次にたとえば 進化石 EvolutionStone 型を定義したとして、 そこにも name があったらバッティングして機能しなくなるよね? ということです。実際にやってみましょう。

» Read More
Haskell / filterM を Maybe Bool だけに制限した filterMaybe 関数をつくる

前回 pure と Just の違い を調べていて、filterM の Maybe 限定版、というのを考えたのでそれを実際に試した。

Monad においては pure より return を使った方が普通なのかもしれません。わかりません。 Javaなどに慣れていると return は Java の return のイメージになり混乱するので、pure を使うで統一しています(今のところ)。 pure と return どっちなの?という件については https://wiki.haskell.org/Monad を見てください。

» Read More
Haskell / コンピュータリストを連続してフィルタする(リファクタリング)

前回 コンピュータリストを bind ( >>= ) を使って連続して条件を適用しました。

しかし、コードをよく見てみると、 Just の部分を pure に変更しても作動するし、その逆に pure の部分を Just に変えても作動する。 今回はその謎を調べます。

» Read More
Haskell / コンピュータリストに連続してフィルタする bind 使用編

前回 のコンピュータリストを使って、フィルタとモナドを試します。

» Read More
Haskell / コンピュータリストを操作する Haskell と Kotlin 比較

Haskell に慣れるため、Koltin と比較しながら、身近な題材を使ってあれこれやってみます。

Spread Sheet Computer List

» Read More
Haskell / data とそのフィールド値の取得

前回 ポケモン型を使いましたが、そのフィールドを取得する方法を整理します。

» Read More
Haskell / data データ型を調べる

Haskell では data Product = Product String Int のようにしてデータ型を定義できる。 これがただの関数だという。 どういうことかわかった(気がする)ので、書き留めておく。

» Read More
Haskell の Map.fromList, Map.lookup の使い方

Haskell での Map 操作の覚え書き。 身近なポケモンを使ったコードをつくります。

» Read More
Haskell / Maybe と Writer モナドと bind

今回は Writer モナドと bind について使い方を調べます。

Writer モナドは複雑なので、Writerで実現したい計算に近いコードを Maybe モナドで書き、その後それを Writer モナドに書き換えます。

» Read More
関数型オブジェクト指向プロラミングを Golang に翻訳する

関数型オブジェクト指向プロラミングを JavaScript に翻訳する というエントリーを2年前に書いた。 Haskell のオブジェクト指向的なコードを JavaScript に書き直したエントリーだが、今読み返してもいまいちピンとこない。 ならば Golang で書き直してみよう。 Golang であれば、JavaScript と違って型を明示的にコード中にかけるので、わかりやすくなるのではないか?

» Read More
関数型オブジェクト指向プロラミングを JavaScript に翻訳する

入門 Haskell プログラミング」の Section 10 に Haskell で オブジェクト指向的なコード例が出ていた。 興味深い。ただ、Haskell のコードを見てもさっぱり意味がわからないので、JavaScript に変換してみた。 なお、本に出ているコードからは多少変えています。

» Read More