BlockArguments で括弧を書かない生活を送る

Posted on 日 05 7月 2020 in プログラミング言語 • Tagged with Haskell, GHC, GHC拡張

GHC 8.6 から BlockArguments という拡張が入った.これは構文拡張で,Haskell 2010 で必要だった幾つかの括弧を省略できるようにするものだ.この拡張を使うことで,Haskell プログラミングにおいて極限まで括弧を省略できるようになった.今回は,BlockArguments の簡単な紹介と,どういう風に括弧の省略ができるかを見ていきたいと思う.

BlockArguments 拡張

Haskell 2010 では,構文要素として幾つかのブロック式が入っている.

1
2 …

Continue reading

Coherent Implicit Parameter

Posted on 火 31 3月 2020 in プログラミング言語 • Tagged with Haskell, 型クラス, 型システム

アドホック多相を実現する方法として,型クラスがある.型クラスは,辞書渡しと呼ばれる方法により,かなり自然に elaboration ができる.ところで,この elaboration は暗黙的引数にも転用できることが知られている。特に、型クラスを搭載した Haskell では,その処理系 GHC の内部実装を利用して暗黙的引数を実現する reflection パッケージ が知られている.

ところで,暗黙的引数の仕組みは,単純に型クラスの型システムを転用するだけでは,coherence …


Continue reading

DerivingVia で deriving 戦略を模倣する

Posted on 月 30 3月 2020 in プログラミング言語 • Tagged with GHC, Haskell, GHC拡張

Haskell では、ボイラープレートは非常に嫌われており、それを撲滅するため強力な型システムの他にも幾つか機能が組み込まれている。その中で非常に強力な機能が、deriving だ。この機能は、データ型の型クラスインスタンスを、その名の通り導出してくれる機能である。Haskell 標準では、幾つかの標準の型クラスにおいて、事前に用意されたアルゴリズムによる導出ができるだけの機能だったが、GHC ではさらに3つの戦略を追加し、広範囲の型クラスの導出が行えるようになっている。特に最近入った DerivingVia と呼ばれる拡張の戦略は、deriving の可能性を大いに引き上げてくれる拡張である。

ところで、実は DerivingVia …


Continue reading

遅延評価でデバッグが困難になる状況

Posted on 日 29 3月 2020 in プログラミング言語 • Tagged with Haskell, 遅延評価, デバッグ

先日、Haskell 界隈で遅延評価によってデバッグがし辛いのはどんな時かと言う話があった。見た感じ、遅延評価によってデバッグのしにくさはそんなに変わらないと言う意見が結構あり、個人的には衝撃だった。僕自身は遅延評価にだいぶヘイトを溜めてる人なので、どういう状況でデフォルト遅延評価が嫌かを実感できる問題を作った。この問題を解けば、きっとヘイトを共有できるはずってわけ。一緒に地獄に落ちような。

なお、かなり主観に寄っていて、結構書き殴ってる部分が多いので、厳密な議論をするにはあまり良い例ではないかもしれない。個人的には、備忘録的な意味合いも強くて、今まで詰まったやつをまとめておくかみたいな感じでもある。

先に結論を書いておくと、

  • プログラム自体が大きくて [1]
  • 複雑な制御構造をしていて
  • (optional) 以下のいずれかの条件を満たす
    • 遅延評価を機能として使っている …

Continue reading

型クラスの Coherence と Orphan Instance

Posted on 金 20 3月 2020 in プログラミング言語 • Tagged with Haskell, GHC, 型クラス

Haskell には型クラスと呼ばれる重要な機能がある.これは名前の通り,型をクラス分けするための機能で,その型に対してある操作が構成できることをその型の性質とみなし,性質に名前がつけられる機能だ.この機能は,アドホック多相,つまりは型による静的なオーバーロードを実現する仕組みとしての側面もある.型クラスに対しては,型ごとにそのインスタンス,つまり操作の実装を与えることができ,ある型がある型クラスに所属していることを型注釈で表明することができる.その表明は,コンパイラによるインスタンスの自動検索で解決され,解決できなかった場合は型エラーになる.

さて,型クラスの仕組みは coherence という,かなり強い性質を要求する.今回は,この coherence がどういう役割を持つかを …


Continue reading

AtCoder の新環境テストの問題を解いてみる

Posted on 月 17 2月 2020 in 学習 • Tagged with Haskell, GHC, AtCoder, 競技プログラミング

AtCoder が現在新環境のテストをしている: https://atcoder.jp/contests/language-test-202001

今までの環境では GHC 7.10.3 だったのが,新環境では 8.6.5 になるので,この機会に参加してみるかということで,テストで公開されてる問題を解いてみた.そのコードと解説.なお,当方 AtCoder の …


Continue reading

State モナドの代わりに Reader モナドを使う

Posted on 木 30 1月 2020 in プログラミング • Tagged with Haskell, GHC, モナド

注意
この記事は公開当時主張に誤りを含んでいたため,大幅に書き直しています.また,公開当時の主張の誤りについても,付録として載せておきました.

Haskell で State モナドはモナドの代表格だ.Haskell 入門者は,多くの場合,状態を伴った計算を State モナドで書くことを習うだろう.しかし,実用上の多くの場面では,State モナドではなく他の選択肢を選んだ方がいい場合がある.一つの選択肢が,Reader モナドと可変参照を使う方法だ.今回は,この手法を使う利点と利用場面について考えていこうと思う …


Continue reading

多相関数を第一級で取り扱う

Posted on 金 06 12月 2019 in プログラミング言語 • Tagged with Haskell, GHC拡張, GHC, 多相関数

今回は,GHC拡張の一つ RankNTypes の紹介をしようと思う.もうちょっとちゃんとまとめたのをいつか Haskell-jp かどっかに投稿したいと思ってるんだが,時間が (さっさと書け).

さて, Haskell のプログラミングにおいて多相関数はかなり重要な役割を持つ.しかしながら,標準の範囲では多相関数自体を第一級の値として扱うことはできない.私たちに許されるのは,多相関数を定義することだけだ.まあ,それだけでもかなり有用なんだけど,多相関数を第一級で扱えると,色々プログラミングの幅が広がる.今回は,多相関数を第一級として扱うというのはどういうことか,そしてそれをするにはどうすればいいか,そうすることで何がうれしいのかを簡単に触れられたらと思っている.

多相関数を第一級で扱うとはどういうことか …


Continue reading

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

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

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

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

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

GHC …

Continue reading