type family を使って再帰的 ADT をオープンにする

Posted on 日 17 11月 2019 in プログラミング • Tagged with Haskell, GHC, GHC拡張

元ネタは Trees that grow . Haskell では代数的データ型 (ADT) を使ってプログミングに使うデータ構造を定義し,その構造を操作することによりプログラミングを行う. ADT はパターンマッチが容易で,再帰的に定義でき,基本的に閉じた構造になっている.そのため便利な反面,その機能が保守で仇となる場合もある.この問題は古くから知られており,いくつかの解決策も提案されてきた.今回はこのうち,現在 GHC で採用されつつある type family を使った解決方法を紹介する.

なお …


Continue reading

pipenv を WSL/Debian で使う際の注意事項

Posted on 木 14 11月 2019 in 環境構築 • Tagged with Python, Debian, WSL

久しぶりに Windows 上で環境構築をすることになったんだけど,その際 Pipenv をインストールするのにちょっと躓いたので,その備忘録.

Pipenv を入れた時のエラー

Windows 上で開発する際は, WSL/Debian を使っている.で,新しい環境でもこれで行くことにして, Pipenv を Python3 環境で使いたかったので,次のようにして入れた:

sudo apt update
sudo …

Continue reading

リテラルをコンパイラ時にチェックする

Posted on 月 28 10月 2019 in フレームワーク • Tagged with Haskell, GHC, リテラル, GHC拡張

Haskell はいくつかのリテラルで型クラスを使用したオーバーロードを許容している.例えば,Haskell で 1 と書いた場合,この型は 1 :: Num a => a になり, Num のインスタンスを定義することで,リテラルに対する実体をユーザも制御できるようになっている.GHC拡張で文字列に対してのオーバーロードなども提供されている.ただ,提供するデータ型とリテラルによっては,プログラムが意図通りに動かなかったりクラッシュしてしまったりすることがある.これを事前にチェックする仕組みを,コンパイラプラグインで実装する方法を紹介する.

なお,環境として以下を想定している.

GHC …

Continue reading

iptables から nftables への移行

Posted on 金 20 9月 2019 in 運用 • Tagged with Debian, iptables, nftables, ファイアウォール

Debian GNU/Linux 10 ,コードネーム buster が安定板リリースを迎え結構経ったので,そろそろアップグレード案件やるかみたいな感じになった.

さて, buster からは iptables に代わり nftables が採用されている.なので, iptables から nftables に移行が推奨されている.で,既存の iptables のルールセットを nftables …


Continue reading

Scala の Map.flatMap の罠

Posted on 火 03 9月 2019 in プログラミング • Tagged with Scala, Collection Library, Map, 標準ライブラリ

Scala のコレクションライブラリは難しい.最近,強くそう思える事案に出くわしたので,そのメモ.なお,使った環境は以下の通り:

Scala のバージョン 2.13.0
Java Runtime のバージョン Java(TM) SE Runtime Environment 1.8.0_131
Java Hotspot …

Continue reading

colimit としての自然数の集合

Posted on 金 30 8月 2019 in 数学 • Tagged with Domain Theory, 束論, 順序理論

F;i{nni}:NPosetF; i \mapsto \{n \mid n \leq i\}: \mathbb{N} \to \mathrm{Poset}


Continue reading

Local Do と型クラス

Posted on 土 27 7月 2019 in プログラミング言語 • Tagged with Haskell, GHC, GHC拡張, do構文, 型クラス

現在, GHC に 線形型の提案 がされていて活発に議論されている.プロトタイプも ここ から利用可能だ. Docker イメージも利用可能なので,気軽に試せると思うので,ぜひ試してみてくれ.

さて,そんな線形型の提案の裏で,副産物として Local Do という拡張が提案されている.今回は,その拡張の紹介と最近思ってることのお話.

Local Do 拡張

Haskell の …


Continue reading

Call Arity と融合変換

Posted on 金 26 7月 2019 in プログラミング言語 • Tagged with Haskell, GHC, 融合変換, コンパイラ, 最適化

GHC は,最適化のため Call Arity と呼ばれるコード解析を行っている.この解析で,自由変数が何個引数を持っていいかを判定し,イータ展開を可能にする.リストにおける融合変換とも密接な関係のある解析だ.こいつの存在とどういうことをやっているかはだいたい知っていたんだけど,ちょっと詳しく知りたい事例があったので調べてみた.そのメモ.

なお元ネタは,Breitner (nomeata) 先生の Call Arity

イータ展開と最適化

Haskell は知っての通り関数型プログラミング言語なので,息を吐くように関数を第1級として使うし,標準ライブラリに無数の高階関数がある.関数は全てカリー化されていて …


Continue reading

DokuWiki の構文拡張プラグインの作り方

Posted on 土 20 7月 2019 in ツール • Tagged with PHP, Wiki, DokuWiki, プラグイン

DokuWiki で Markdown が書けるプラグインを結構前に作った.で,たまにメンテしてるんだけど,そのメンテのために色々備忘録を残しておこうと思ったので,そのメモ.

DokuWiki のプラグイン作成

DokuWiki のプラグインの作成方法は, https://www.dokuwiki.org/devel:plugins に大体まとまっている. DokuWiki では,以下の種類のプラグインを書ける.

構文拡張プラグイン
文法を拡張するプラグイン.
動作拡張プラグイン …

Continue reading

GHC の線形型プロトタイプのお試し環境を作る

Posted on 金 28 6月 2019 in プログラミング言語 • Tagged with Haskell, 線形型, GHC, Docker

現在, GHC に 線形型の追加提案 が出ている.その提案に合わせて,プロトタイプも公開されている.内容はあまり詳しく追ってないけど,お試し環境は作ってみたのでその備忘録.

線形型プロトタイプ実装

線形型の提案は, GHC Proposals (https://github.com/ghc-proposals/ghc-proposals/pull/111) で議論されている. https://arxiv.org/abs …


Continue reading