Template Haskell でいい感じに時間の長さを書けるライブラリ duration を作った

Template Haskell を使って,時間の長さをいい感じに(人間が読みやすい形で)記述できるライブラリを作った.

hackage.haskell.org

github.com

(実は GW 前くらいには既に公開していたけど,ブログを書く余裕がなかった……)

続きを読む

Maybe と IO を一緒に使いたくなったら

たまには初学者向けにライトな話題を.

対象読者

  • すごいH本12章13章ぐらいまでは読んだ
  • do 構文を使って IO などの処理が書ける
  • Haskell のプログラムはなんとなく書けるが,あまり綺麗に書けている気がしない
続きを読む

TypeFamilyDependencies の実用的な例を考える

FunctionalDependencies という GHC 言語拡張がある.Haskell Wiki によると

Functional dependencies are used to constrain the parameters of type classes.

と書かれているが,これはどういうことか.

Haskell Language Report で定められた範囲では,型クラスに与えられるパラメータは1つに限られるが,MultiParamTypeClasses を用いると,複数のパラメータを与えることができる.この際に,パラメータとして与えられた (複数の) 型の間の関係性に制限を加えることができるのが,FunctionalDependencies なのであった.恐らく多くの人が初めて目にするのは,mtl package の MonadReader の定義 なのではないだろうか.| m -> r というのがそれである.

class Monad m => MonadReader r m | m -> r where
   ...

さて,GHC 8 から TypeFamilyDependencies という GHC 言語拡張が追加された.これについては既に lotz 先生が『型族が単射だと嬉しい理由』という記事を書いていらっしゃる のだが,(氏には失礼ながら) 少しばかりわざとらしい例だと感じたので,もう少し実務的な例を引き合いに出して,有用性を示したいと思う.

qiita.com

続きを読む

Template Haskell でコード中に JSON を埋め込んだりコンパイル時にファイルから型安全に読み込んだりする

前回よりはもう少し実用的な例を.

Template Haskell を使って,Haskell のコード中に JSON をそのまま埋め込むことができるようにする.また,あらかじめ用意しておいた JSON ファイルをコンパイル時に読み込み,指定したデータ型の値にする.

ToC

  1. コード中に JSON を埋め込む
  2. コンパイル時に JSON をファイルから型安全に読み込む
続きを読む

Template Haskell でコンパイル時 FizzBuzz

数ヶ月前に Twitter で,コンパイル時に FizzBuzz を計算して,実行時には計算された文字列を出力をするだけ,というコンパイルFizzBuzz を何かの言語でやっているのを見かけた.元ネタは江添さんがC++で書いたものらしい.インスピレーションを受けて,Haskell で書いてはみたが,簡単すぎて全然おもしろくなくなってしまった.

続きを読む