OCamlを使っている皆さん。テストコードは書きますよね。 そこでOUnitの登場です。 OUnitはOCamlのユニットテスティングフレームワークです。OSSなどでも良く使われています。…が、OUnitは結構冗長、というよりテスト自体の本質が見えにくくなることがありま…
練習もかねて、テスティングフレームワークを書いてみてました。最初はこんなに大きなものを作る気がなかったので、バージョン管理してなかった(汗正直言ってあまり出来は良くない。複雑だし、いろいろメンドイ。それにOUnitよりいい点があまり無い。 方向…
ずいぶんとエネルギーを持っていかれた気がする…最近、モナドも使い慣れるといろいろ好都合だったりするので、自分用にほぼ最小に近いレベルでOCamlにモナドを実装していこうといろいろなモナドの実装をしています。とはいえ、まだMaybe, List, Lazyくらいで…
前回とはうって変わって、ちょっとだけassert文をどうにか出来ないかなぁという感じの方向性で作ってみました。 module type ASSERT = sig type t val cmp : (t -> t -> bool) val printer : (t -> string) end module MakeAssert(AssertType:ASSERT) : sig …
OUnitはOCamlでは関数がオーバーロード出来ないとかそういう関係で複雑な処理に対してや、パラメタライズドなテストコードが非常にコード自体が見にくくなる傾向にあります。なので遊びがてらいろいろ試してみようと思いました。 open OUnit open List let (…
前回の続きです。Value restrictionによって let x = fst ([], ()) val x : '_a list = [] となってしまっていた。うん、非常に残念。これは別に多相的にあつかってもいいはず。 Relaxed value restriction ここで、Relaxed value restriction。 これはValue…
皆さん、いかがお過ごしでしょうか。楽しいOCamlライフ送ってますか?私は紆余曲折あって「なぜだ・・・なぜ自分が使っている型システムすら知らないんだ!?」ということで、OCamlの型システムを勉強しようと思ってます。そのあたりで論理学の知識がどうし…
ヴァリアントってパターンマッチできるんですねー、なんて言ったら流石に初心者すぎるかも知れませんが、次のようなパターンマッチが可能なことは知りませんでした。 # type myvariant = [`A | `B];; type myvariant = [ `A | `B ] # let f x = match x with…
なんかこのシリーズ、増えれば増えるほど自分のOCamlへの知識のなさが見えてくる… 今回はFunctional Objects.「あー、それね。はいはいChapter 3あたりに書いてあるのでしょ」と思った人は正解です。いやはや、私は今"O"縛り中なので、クラスとかオブジェク…
今回はOCamlの現在のlatest versionである3.12.1には実装されていない、GADTについて試してみました。とりあえず、現状でOCamlのGADTを試すにはOCamlのsvnリポジトリからgadtsをとってきてビルドとインストールを行う必要があります。ただし、これを行うと、…
今日は夏に向けていっちょOCaml界に伝わる怪談話でも… ではなくて、幽霊型について。使えたら面白そうだと思うのですが正直未だに実践で使ったことがないので、非常に残念な気分になりつつも書いていきます。幽霊型は次のように定義できます。 # type 'a num…
ターミナルで $ ocamlと叩くとOCamlのインタラクティブシェルが起動します。 Objective Caml version 3.12.1 # で、さぁてモジュール読み込もうと思ったときに「あっ、しまったぁ!インストールしたモジュール試したかったから、cmaファイル読み込ませないと…
第三回にして、v 3.12の新機能ではなく前からあった機能を書きます。皆さんはリテラルのsuffixをご存知でしょうか。 浮動小数点数を『1.0f』なんて書いているのは見かけたことないですか?見たことない?さすがOCamlばかりやってきた人は違いますね!(違リ…
今回はmodule type ofによるモジュールのシグネチャの取得。・・・あれ、また3.12の新機能じゃないか!それはいいんです、それは。最近ちょうど使う機会があったんですっ!たまたま使っただけですっ! module type of シグネチャを書くときに、モジュール同…
今回は私の貧弱ぅなOCaml力を晒すべく、最近知ったばかりのOCamlの知識を書いていこうと思います。自分が知らなかったOCamlネタが見つかり次第、随時記事として追加していくつもりです。今回はlocal open。これは3.12で追加された機能ですね。まあ、知らなか…
というタイトルの通りのことを目指して、現在OCamlとOcsigenというWebアプリケーションフレームワークでWebアプリケーションを作ってみようと思ってます。ちなみにこのOCamlとOcsigenというのはかなり癖のある環境で、私は今のところDebian上でしかOcsigenま…
先日Coqの関数をOCamlのコードとして出力してみました。サンプルとしては (* ret_num.v *) Definition ret_num (n : nat) : nat := n. Extraction "ret_num.ml" ret_num. を coqc ret_num.vして (* ret_num.ml *) type nat = | O | S of nat (** val ret_num…
ハマったと言っても大してハマったわけではないので、あとでlablglutの記事を書いてそちらに統合したいと思ってます。 Windows上でOCaml + lablglutで遊んでみていたのですが、どうもリンクが上手く言ってない模様でした。 > ocamlopt -I +lablGL lablglut.c…
OCamlのモナド拡張、pa_monadで遊んでみました。今回はリスト内の値を長さとする棒を組み合わせて三角形ができる場合に、その周長が最大になるものをpa_monadを使ってListモナドで求めてみました。 open List (* Listモナド *) module ListM = struct let re…
今日はTDD Boot Camp 福岡にてOCamlを使うことになってますが、昨日OCamlの本のGUIライブラリの部分以外を読み終えたばかりというところです。 しかもクラスや多相ヴァリアントなどはほとんど打ち込んでもいないので、かなり他の人の足を引っ張るのではない…
ちょっとかじってみたので、OCamlのファンクターについて書いてみます。ファンクターと言えば、C++の関数オブジェクトを思い出しますが、OCamlの場合のファンクターはどちらかというとC++のテンプレートに近い感じがします。ファンクターは次のような構文を…
OCamlを最近始めましたが、まだTDDでOUnitを使ってプログラミング・・・とまではたどり着いていません。はっきり言ってしまうと、OUnitで使われている構文がよくわからない、おまじない的な要素が今のところとても多いです。ですが、使わないと始まらない、…
前回は雑然とC/C++やJavaとOCamlとの違いを整数型や浮動小数点型についてみてみました。今回はOCamlに存在する型についてまとめてみます。 unit型 初めに他の言語では聞きなれない型をもってきました。とはいっても、この型は"()"という要素を含むだけのもの…
このたび、OCamlに入門いたしました。OCamlとは"Object Caml"の略で言葉通り、「オブジェクト指向なCaml」です。Camlとは(英語で『ラクダ』ですが)、プログラミング言語の一種でMLという関数型言語の方言として作られた言語です。 つまりOCamlも関数型言語で…