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

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

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

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

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


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

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

Rust のジェネリック関数はどうコンパイルされるのか

Posted on 月 24 6月 2019 in プログラミング言語 • Tagged with Rust, 多相関数, ジェネリクス, トレイト

最近, (特に境界条件を伴った) 多相関数が言語ごとにどういうコードを吐くかが気になったので, Haskell とコードの生成方針が異なるという噂の Rust を見てみることにした.その覚え書き.なお, Rust 普段使いではないので間違ってるかもしれないのと,情報が古いかもしれない.

https://rust-lang.github.io/rustc-guide/about-this-guide.html が主な参考文献.使った rustc は,

  • rustc: 1 …

Continue reading

GHC IO モナドの中身

Posted on 金 17 5月 2019 in プログラミング言語 • Tagged with Haskell, GHC, IO

Haskell の IO モナドって,中身どうなってたんだろと気になってて,ちょっと調べてみた.そのメモ.

IO モナドと RealWorld

まずは基本から. IO モナドは, Haskell の根幹となるモナドで, main も IO で書く. GHC では中身は次のように定義されている [1]:

-- In GHC.Types …

Continue reading

Scala コードの裏側

Posted on 水 24 4月 2019 in プログラミング言語 • Tagged with Scala, Java, JVM, 最適化

先日, Scala コードの裏側について幾つか話を聞いた.で,気になったので実際に JVM コードを出して,色々見てみることにした.なお,当方 Scala 初心者なので,おそらくかなり間違いを含んでるのと,普段使いの感覚からは離れてる部分はあると思うので,そこら辺は注意して読んでくれって感じ.

Scala コンパイラの概要

Scala コンパイラが実際どういう処理をしてるのか知らなかったので,まずはその辺を調べた. Scala は,プログラムを複数のフェーズに分けてコンパイルし,最終的に JVM …


Continue reading

STG Version 2.5 の動作

Posted on 日 21 4月 2019 in プログラミング言語 • Tagged with Haskell, 抽象機械, GHC

先日 STG の動作について説明する機会があったんだが,ちゃんと説明できなかった.で,ちょっとこれじゃまずいって思って,色々読み直してる.で,いざっていう時のためにまとめとくかみたいな気分になっており,この記事が錬成された.なお,今の GHC の STG では色々変わってるので通用しないとこも多い.そこは注意.

この記事での STG について

この記事での STG は, Spineless Tagless …


Continue reading