プログラミング」カテゴリーアーカイブ

PureScript から TypeScript 用型定義 (.d.ts) を生成するツールを作った

前置き

TypeScript で作っていたプロジェクトに、後付けで PureScript を追加しようとしたらかなり辛かった。

(わざわざ言語を混在させたい理由としては、型クラスや演算子オーバーロードを使いたい&既存のコードを全部書き直す暇はない、が挙げられる)

辛い理由としてはそもそもモジュールとバンドラーの周辺がまだ成熟していないというのもあるだろうが、 TypeScript 固有の理由として、 TypeScript コードから PureScript モジュールを読み込むための型定義が足りないという問題がある。

Stack Overflow を見ると、同じことで悩んでいる人がいた:

しかし、どの解決策もイマイチである。

コンパイル済みの PureScript を使うだけなら --allowJs オプションという手もあるだろうが、せっかく型がある言語で書いたのだから、適切な型チェックがされて欲しい。PureScript のコンパイル時に TypeScript 用の型定義ファイル .d.ts を出力させるようにはできないのか?

PureScript の GitHub Issues にも「.d.ts を生成させたい!」というトピックがあるが、特に動きがあるようには見えない。

コンパイラーにそういう機能がないならば、自分で作ってしまおう!ということで、作った。

https://github.com/minoki/purescript-tsd-gen 続きを読む

Haskell でのデバッグ手法あれこれ

プログラムにバグはつきものです。強力な型システムを備えている Haskell でもそれは同じです。この記事では、 Haskell プログラムのデバッグ手法をいくつか挙げてみます。

なお、使用している GHC は 8.2.2 です。より新しいバージョンで追加されるであろうより便利な機能は、この記事の対象外です。

続きを読む

PureScript 雑感

PureScript は、 Haskell ライクな altJS である。「Haskell ライク」という評判に劣らず、 Haskell の最も重要な特徴である型クラスをきちんと受け継いでいる。

現在のバージョンは 0.11.7 である。したがってまだ安定しているとは言えない。バージョン 1.0 まで解決されるべき Issues はこれだけある。 続きを読む

「週刊 代数的実数を作る」創刊

コンピューター上で実数を取り扱うには、いくつかの方向性がある。普通は浮動小数点数によって近似することが多いと思うが、多倍長計算を始めとする、「コストをかけてでも正確に」計算するという方向性もある。

そのような「正確に取り扱える」実数のクラスとしては、整数(多倍長整数)や有理数はある程度普及していると思う(標準で備えているプログラミング言語がある)。それよりも広いクラスとして、代数的実数、つまり(整数または有理数係数)代数方程式の根となるような実数全体、というものがある。

代数的実数が計算機で取り扱えるということ自体は割と知られた事実だと思うが、実装は割と大変で、工夫の余地がある。有理数のように「GCD さえ実装すればよい」というものではない。

かくいう私も最近までその辺を真面目に勉強しようとは思っていなかったわけだが、何となくモチベーションが湧いてきたので、代数的実数に関するアルゴリズムを勉強しつつまとめたものを記事として Web 公開してみようかと思った次第である。

実装には筆者の好みで、 Haskell を使う。実際のところ、 Haskell による代数的実数の実装は既にあるようだが、まあ気にしない(自身の勉強が主目的なので)。

というわけで、以下のページで公開している:

https://miz-ar.info/math/algebraic-real/

「週刊」と名乗っているが、毎週末に更新することを目指している。果たしていつまで続くかは不明である。 続きを読む

交差型 (intersection types)

型システムの勉強の続き。

有界量化を持つ体系 System F<: (Fsub) に続いて、交差型を持つ体系 F (Finter) を実装する。

作ったものは、前と同じ GitHub に置いてある:

https://github.com/minoki/LambdaQuest

TaPL でも交差型について言及されているが、あまり詳しく書いてあるとは言えない。そこで、B. C. Pierce の Programming with Intersection Types and Bounded Polymorphism (1991) という論文を参考にした。著者のサイトにPDFが置いてある。似たようなトピックの論文が他にもあるようだが、それらとの関係は確認していない。

論文の Finter では有界量化の上界に関して反変な部分型関係を入れているが、それをやると(TaPLにもあるように)部分型関係が決定手続きでなくなるらしいので、今回実装した Finter には(前回実装した Fsub にも)それは入れていない。

続きを読む

型システムの勉強

型システムを自分で設計したいと思ったので「型システム入門 プログラミング言語と型の理論」(原題:Types and Programming Languages, 略して TaPL)を読んで勉強している。

この記事は私の雑な理解を吐き出したものであり、あまりまとまっていない。しかし、何かしらをアウトプットすることに意義がある(キリッ 続きを読む