class Hoge { public static <A> A foo(A x) { if (x instanceof String) return null; return x; } public static void main(String[] args) { System.out.println(foo("Hello")); // -| null System.out.println(foo(42)); // -| 42 System.out.println(foo(new Object())); // -| java.lang.Object@15db9742 } } この例については、静的型から予想される挙動を裏切るようなプログラムが書けるだけで何も嬉しくないけれど、時には実行時型情報が便利な場合もある。 型を表す値 世の中には実行時型情報のあるジェネリクスを「真のジェネリクス
I've just come across the following code snippet in OCaml's documentation about GADTs: let rec eval : type a. a term -> a = function | Int n -> n | Add -> (fun x y -> x + y) | App (f, x) -> (eval f) (eval x) which, once evaluated in utop, has the following signature: val eval : 'a term -> 'a = <fun> I also noticed that, when replacing type a. a term -> a by 'a term -> 'a or just removing the signa
このエントリはML Advent Calendar 2015の14日目の記事です。 13日目の記事はよんたさんの関数型プログラミングにおける再帰関数の考え方でした。 ML Advent Calendar 2015を追っている方なら大体察しが付くと思いますが、この記事はobj_magicさんの A GADT implementation of AVL treeに刺激を受けて書きました。 GADTと型レベル自然数を使ってAVL木を書けるのなら、他のデータ構造も同じノリで実装してみると面白そうだと思ったので…まぁ二番煎じですね。 二項ヒープとは マージが速いヒープの実装の一種らしいです。僕も二項ヒープを実装したのはこれが初めてで詳しい事は分からないので、気になった方は Amazon.co.jp: Purely Functional Data Structures: Chris Okasaki:
Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
I’ve been interested in GADTs1 for quite some time now but I’ve had a hard time finding proper use-cases for them in my day-to-day programming tasks; this is not because GADTs aren’t useful, they are, but rather that my understanding of them has been limited. I often experience this when I’m learning more advanced features of programming languages and I’ve found that I personally find it easier to
When GADTs (Generalized Algebraic Data Types) landed in OCaml, I wasn’t particularly happy about it. I assumed that it was the kind of nonsense you get when you let compiler writers design your programming language. Which is to say that the standard GADT examples all seem to be about the kinds of things that compiler writers do, like embed domain-specific languages or build typed abstract-syntax t
今回はOCamlの現在のlatest versionである3.12.1には実装されていない、GADTについて試してみました。 とりあえず、現状でOCamlのGADTを試すにはOCamlのsvnリポジトリからgadtsをとってきてビルドとインストールを行う必要があります。 ただし、これを行うと、今まで入れていた標準でないライブラリのうち、cmiファイルが関係するライブラリはほぼ全滅します(多分)。つまり自力で入れ直しです。それにバージョン名が変更されたりする関係でoasisパッケージでOCamlのバージョン指定がある場合、そのままでは対応していないバージョンとして扱われるなどの問題があります。現状、そのまま普段の開発で使うにはかなり自力での解決が必要になりそうです。 それでは以上のことに注意しながら、GADT対応バージョンを入れてみます。 $ svn co http://caml.inria
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く