23:40HaskellやっていくGHC8.8.1令和元年白露の候Tweet広告を非表示にするもっと読むコメントを書く2019-01-08GHCの線形型プロトタイプを試すだけhaskellGHCに線形型を導入すると以下のような良い事があるらしい。ファイルハンドル、ソケット、DBコネクションのようなリソースについて、これらを提供するAPIの設計者が安全な使用を強制できる。防止することができる。リソースAPIの実装をうまくやるとoff-heap(GCの対象外)でリソースを確保・解放できる。GC対象が少なくなることによりGCによってプログラムが停止する時間を減らせる。過剰な直列化を強要しない。リソース安全性を保ちつつもできる限り並列化できる。詳しくはproposal。この記事では線形型GHCのプロトタイプ実装および線形型ファイル操作ライブラリのプロトタイプ実装を試してみる。ここで紹介するものが正式リリースで変更されている可能性は大いにある。APIを使うのがマイブームなので今回はstackを使わない方法でやっていく。GHCのビルド準備まずGHCのビルドに必要なものをインストールする。ncursesはapt等でインストールできるはず。ghcはUnix系環境であればghcupで導入するのがやりやすいと思う。異なるバージョンのghcを切り替えることもできる。alexlinear-typesブランチをビルドGHCのソースはGitHubのミラーから取得するのが速い。https://github.com/ghc/ghclinear-typesブランチは別のところで開発されているのでリモートソースに追加してチェックアウトする。tweag/linear-typesGHCのgit運用がGitHubとミスマッチを起こしているところがあるので少し手を加える。git\@github.com:/ghc/packages/ビルドする。makeのNは物理CPUコア+1にするのが良いらしい。知るghcコマンドになっている。実際に試すやっと線形型GHCを実行する準備ができた。変更検知のようなインタラクティブな環境を用意するとやりやすい。ようにするとよいだろう。プロジェクトのビルドで使うghcを変更できる。いうローカル環境用ファイルに保存される。追加しておくとリポジトリから環境依存のファイルをなくせる。--with-compiler=/path-to-ghc/ghc/inplace/bin/ghc-stage2それではコードをコンパイラにかけてみよう。コンパイルエラーになる。同じだが左の値を必ず一度だけ使わなければならないという制限がつく。1回も使っていないのでエラーとなる。実用的な例も見てみよう。パッケージは線形型によるファイル操作API(とそれに必要な諸々)を提供する。パッケージを持って来てくれる。./ファイルを2つオープンし、片方から1行読んでもう片方に書き込むプログラムは以下のようになる。これはちょっと込み入っている。mainRIOいくつかの要素が登場している。要素ごとに見ていこう。別のものに変更するためにつけている。線形型向けに作られたものではないため評価に線形型の制限が入っていない。変更することができる。(rioとは関係ない)。IOという名前だが現状提供されているのはいくつかのファイル操作だけである。以外の関数はすべてハンドルも返すようになっているのがポイント。関数によって通常のIOの中で起動することができる。いうのは線形型の制限の中から制限のない値を取り出すときに使うデータ型である。返したハンドルではなく引数のハンドルをそのまま返すなどしてみるとよい。コンパイルエラーのメッセージがどのようなものになるかぜひ確認してみてほしい。線形型の導入によって一般のHaskellプログラマーは影響を受けるだろうか?私は影響は限定的だと思う。使ってはじめて有効になる。線形型の導入による実行時システムへの変更もない。それを使うのであれば線形型Haskellの書き方を学習する必要はあるだろう。以下の記事に紹介されているようにHaskellにはすでに様々なリソース管理のツールがある。レイテンシが特に気になるサーバやゲームの開発くらいだろうか。コンパイラを開発している。よるWebプログラミングを見据えてのものだという可能性はあると思う。クライアントサイドWeb開発はまさにレイテンシが重要な領域だからだ。いう設定記述用言語があり、使ってみたところ良い感じだったので紹介します。この記事は先日某所で発表したものの拡大版になります。speakerdeck.comDhallとは何かDhallについて短かく表現するなら公式サイトの以下の説明が分かりやすいです。importsデータ表現にプログラマブルさと静的な検査とファイルのインポートを加えたものというわけです。今どきの言語らしく公式フォーマッタもあります。あと大事なのはチューリング完全ではないということです。具体的にはループなどは書けません。屋上屋を重ねた末にはシンタックスハイライトが効かない・実行時にならないとどういう設定になるか分からない・下手すれば無限ループして停止しない設定ファイルができあがってしまいます。良いバランスを達成していると思います。まとまっており、プロダクションで十分に利用可能と言えるでしょう。(僭越ながら先日私も会社で使われている長大なYAMLをDhallから生成する仕組みを作りました。ファイルを読み込むためのいくつかのバインディングがあります。DhallコマンドラインツールStackがない場合はインストールします。PATHを通してください。Dhallツール群は以下のようにしてインストールします。入っていないので、この記事ではこれらはまだ独立したコマンドとして扱います。(つまり、アプリケーションに投入する前にどのような設定になるか&形式が間違っていないかが分かる!)。ファイルのフォーマッタです。ファイルの保存時にこれが走るようにエディタを設定しておくのがおすすめです。入れておけば勝手にそのような設定にしてくれます。利用したアプリケーションとしては以下のものがあるようです。本番フローに導入しやすいかもしれません。2つのコマンドがインストールされます。ファイルに変換します。記述を楽にするための多くの関数を提供します。ファイルに興味がない人でも参考文献として覚えておくとよいでしょう。インストールできます。設定を記述できるようにするツールです。生きる領域と言えるでしょう。環境ではインストールできません。インストールする必要があります。バインディングが必要です。パッケージを加えます。Dhall基礎編それではDhallの各要素を見ていきましょう。データ表現データの表現は一般的な設定ファイルを表現するのに十分なものを揃えています。