Coyoneda って…… お前 functor がデータ構造になっただけやんけ!!

operational (あるいは freer) と呼ばれているものの説明として,

  • a) Coyoneda を使うと,kind が * -> * であるような任意の型から functor を作り出せる
    • 任意の型 f :: * -> * について Coyoneda fFunctorインスタンスになる
  • b) Free を使うと,任意の functor から monad を作り出せる
  • a と b を組み合わせると,適当な型 f :: * -> * から monad を作り出せて便利〜🙌

というストーリーが往々にして語られる*1

*1:少なくとも2年ぐらい前に lotz 先生に聞いたときはそうだった.

続きを読む

カラーコードを渡すと色のプレビューをしてくれるコマンドラインツールを作った

引数としてカラーコードを渡すと,指定した色のプレビューをしてくれるコマンドラインツールを Rust で書いた.

github.com

もちろん 24-bit color 対応の端末エミュレータを使っていないとちゃんと動かない.2018年上半期に作った役に立たないものランキング第一位.

続きを読む

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

続きを読む