タグ

ブックマーク / osiire.hatenablog.com (12)

  • OCamlの開発環境の作り方 2012年暮れ版 - osiire’s blog

    この記事はLL/MLアドベントカレンダーの記事です。 一時期停滞していたOCamlの開発環境は最近進化してきています。2012年暮れ時点における知見をまとめてみましょう。なお、これらの進化はOCaml開発チームはもとより、OCamlPro, @camlspotter氏、@m2ym氏の多大な貢献によるものです。 OPAM OPAMはGODI,OASISと同様OCaml専用のパッケージマネージャーです。従来システムに比べて使いやすさが格段にアップしています。現時点ではパッケージマネージャとしてOPAM一択で問題ないでしょう。 http://opam.ocamlpro.com/ (aptやyumに似た)単純で使いやすいコマンドラインインターフェイス。 ビルドシステム非依存でOPAM化が簡単。 デフォルトリポジトリがgithub上にありPRできる。 ダウンロード&インストール: $ wget ht

    OCamlの開発環境の作り方 2012年暮れ版 - osiire’s blog
  • 第一級モジュールで単体テスト可能なコードを保つ - osiire’s blog

    コードを単体テスト可能なよう保つためには色々なやり方がある訳ですが、一番いいのは副作用を分離して局所に押し込めておく手法でしょう。でも、処々の事情によりそんなに綺麗に分離する事もできないので、次善の策としては副作用部分をパラメーター化して別のモックに置き換え可能にしておくというやつがある訳です。そしてOCamlではそのパラメーター化の方法にも幾つかやり方があって、次の4通りの方法が考えられます。 副作用を行う部分を関数化して引数として渡す。 副作用を伴う部分が複数ある時はレコードにして渡す。 レコードの代わりにファンクター経由で渡す。 ファンクターの代わりに第一級モジュールで渡す。 例えばこういうコードを単体テスト可能にしたいとします。(単純化のため省略した関係で殆どなんのロジックもない関数になっていますが、実際にはもう少し条件分岐が入ったコードだと思ってください。) (* 単体テスト可能

    第一級モジュールで単体テスト可能なコードを保つ - osiire’s blog
  • OCamlを使ったシステム開発まとめ - osiire’s blog

    うちの会社(有限会社ITプランニング)でやってきたOCamlを使ったシステム開発の概要を書いておきます。ふと思うと今までまとめて公開したことはなかったなと。別に隠す程のものじゃないし、もしこれからOCamlを使ったプロジェクトを始めてみたい人の参考になれば嬉しいです。 2006年 某証券会社のWebサービスの一部を担当 株価を解析して、その結果をWebAPIとして提供。OCaml + MySQL。HTTPベースで提供されるXMLファイルが生データだったので、この時初めてXMLのパースにxml-lightを使った。これはかなり便利。その後も使い続けている。nc(network cat)ライクなモジュールも作った。行列変換のためにC言語との連携もしたけど、特に問題なし。そういえば、この頃はmarshalingが好きで、DBへmarshalingデータをそのまま保存して「Objectデータベース

    OCamlを使ったシステム開発まとめ - osiire’s blog
  • レイジーリスト - osiire’s blog

    OCamlでもレイジーリストは便利ですねー。参考のために、某案件で使うために書いたレイジーリストの実装を書いておきます。バグがあったら某案件のプログラムもバグっていると言うことなので、痛いです。ぜひご報告をお願いします。tail-recursiveとかも一応考えたはず。メモリ効率やスピードは計ってないです。ごめんなさい。 格的に使いたい人はOCaml Batteries Includedを入れると便利関数が多くて幸せになれますよ! http://thelema.github.com/batteries-included/hdoc/BatLazyList.html (** lazy list @author IT Planning Inc. @version $Id$ *) (* Copyright (c) 2007 IT Planning inc. All Rights Reserved

    レイジーリスト - osiire’s blog
  • Let’s module programming! - osiire’s blog

    オブジェクト指向なら分かるけど、モジュールでどうやってある程度の規模のプログラムをするのか、全く想像つかない!そんな諸氏のためにモジュールプログラミングのテクニックを、レベル分けしながら解説してみたいと思います。 レベル1(基礎編) アプリケーションで使う予定のデータや処理を大雑把にグループ分けして、それらに名前をつけて.mlファイルにします。個々の.mlファイルがモジュール、かつ、スコープ、かつ分割コンパイルの単位になるので、ある程度見通しがよくなります。モジュール同士の連携は、基的にモジュール名を指定するだけ。後はその.mlファイルにシグネチャーを付けるもよし、つけなくても可。最後にmain.mlファイルを作って、そこからアプリケーションを起動するようにすればOK。とても簡単です。しかし、実を言うと、凝った作りのライブラリでもない限り、ほとんどこれで事足ります。大事なので二回言います

    Let’s module programming! - osiire’s blog
  • モジュールとクラスの使い分け方 - osiire’s blog

    OCamlにはモジュールとクラスがあります。この二つの仕組みは、直感的によく似た機能を持っているので、どう使い分けたらいいのか迷う時があります。そこで、モジュールとクラスの使い分け方について少しまとめてみます。 基礎的なデータ/データ構造の場合 スタックとかキューとかグラフとか日付とか、内部構造を隠して操作だけを提供する、比較的基礎的な構造を作りたい場合です。この場合は、迷わずモジュールでいいです。ここをクラスにすると、バイナリメソッドで泣きます。 アプリケーションデータの場合 アプリケーション内で使う特定のデータ構造は、色々なデータの集合である事が多いので、大抵レコードになります。このレコードの代わりにクラスを使うのはありだと思います。逆に、これをモジュールでやると、内部型がないモジュールになって、オーバースペックな感じになります。もちろんレコードのままでいいなら、別にわざわざクラスにす

    モジュールとクラスの使い分け方 - osiire’s blog
  • first-class moduleをちょっと身近に - osiire’s blog

    来るversion 3.12ではfirst-class moduleが導入されるわけですが、この機能はmoduleの世界を結構広げてくれます。しかし、その文法がやや煩雑で、真面目に使おうとすると疲れてしまう事が危惧されます。そこで、first-class moduleをお手軽に使えるcamlp4拡張を作りました。https://forge.ocamlcore.org/scm/viewvc.php/trunk/src/camlp4/pa_fcm.ml?view=markup&root=amthing 導入する文法は次の6つです。 "struct ... end"を"{ ... }"と書けます。 "sig ... end"を"{ ... }"と書けます。 関数の引数で"( module M : Sig )"とすると、シグネチャーSigのモジュールMを束縛できます。 ファンクターの定義時に引数を

    first-class moduleをちょっと身近に - osiire’s blog
  • SRFI-45 - osiire’s blog

    concurrent cellのFRPの実装においてfilterがメモリリークする問題があって、どうするべと悩んでいたのだけれど、まさに解決策があった。SRFI-45(http://srfi.schemers.org/srfi-45/)とその日語訳(http://www.katch.ne.jp/~leque/translations/srfi-45/srfi-45j.html)。紹介してくれた&日語訳を公開してくれているleque氏に感謝感激雨あられ。なにはともあれ、OCamlで同等のプログラムにしてみた。テストも何もしていないので怪しいけど、たぶんこんな感じ。OCamlにはdefine-syntaxなんてないので、そこはlazyにしてある。 let (!$) = Lazy.force type 'a exp = 'a Lazy.t and 'a t = ILazy of 'a pro

    SRFI-45 - osiire’s blog
    okagawa
    okagawa 2010/03/01
    遅延評価とメモリリーク。SRFI-45
  • FRPの実装 - osiire’s blog

    前にも触れたけど、これ((http://conal.net/papers/simply-reactive/)を元にOCamlでFRP(っぽいもの)が実現できる機能をconcurrent cellに追加した。ほぼできたと思う。あとはテスト(バグがないか、メモリリークはないか、速度はどうか)といったところ。もし興味がある強者がいらっしゃったら、 svn checkout svn://svn.forge.ocamlcore.org/svnroot/ccell からチェックアウトして下さいまし。 とにかく、このFRPの実装は落とし穴が多かった。最初は簡単かもと思って始めたのに、まず論文に書いてあるHaskellの実装をOCamlに直すところで躓き(主に止まらない)、Futureの意味を理解するのに躓き、論文のままだとpull評価の値を評価しないと延々とメモリがわれる問題にどう対処するか悩み(しか

    FRPの実装 - osiire’s blog
  • maybeモナドはDB読み込みにちょうどよい気がする - osiire’s blog

    思い切ってpa_monadを実プロジェクトに初めて投入してみた。特に今回はDB周りの処理が多かったので、maybeモナドが大活躍。 module MaybeM = struct let bind m f = match m with None -> None | Some v -> f v let return v = Some v end データベースからselect文でデータを取ってこようとすると、列の値がoptionになる(nullの可能性もあるから)ので、来はパターンマッチしてSomeの中身を取り出さなきゃならない。でもmaybeモナドならそんな事殆ど気にしなくてよくなる。次のコードは実際に使ったコードの一部。 select original_db (* select文実行 *) "select distinct maker_code, syasyu_code, syasyu,

    maybeモナドはDB読み込みにちょうどよい気がする - osiire’s blog
  • OCamlerがScalaを触った感想 - osiire’s blog

    やっぱりタプルとオプションはどんな言語でも必須だと確信した 正規表現のマッチ結果をパターンマッチして変数束縛できるのは便利だわぁ Javaの資産がまるごと使えるのはすごい、というかうらやましい η変換に不自由なOCamlerから見ても、高階関数がやや書きづらい シンボルって要るのか? JVMの立ち上げコストは意外と気にならない APIリファレンスの読み方が慣れないと難しそう パフォーマンスを犠牲にしてでも、書き方が多少繁雑でも、構造的部分型が許されるのは素晴らしい。正直OCamlerはこれがないと生きていけない

    OCamlerがScalaを触った感想 - osiire’s blog
  • 続・ポイントフリー的ななにか - osiire’s blog

    OCamlのlet多相は、 値は多相で処理。それ以外は単相。 単相が多相の部分型になってるときは、多相を回復。 という二段階。で、この部分型判定には、単相型がcovariantな位置にのみ出現するかどうかを調べる。covariantな位置というのは、要するに関数型の右側のこと。[追記]もうちょっと正確に言うと、型の大小関係(部分型の関係)を保存する演算の事をcovariantな演算と言い、多相を回復したいと思っている型が、単相型変数へのcovariantな演算のみで構成されていれば、多相への部分型が成立するので回復させるぜ!という事。 さて、これだけの原理に乗っ取って実例を確認してみましょう。 # let x = ([], ());; (* 右辺が値なので多相ですね *) val x : 'a list * unit = ([], ()) # let x = fst ([], ());;

    続・ポイントフリー的ななにか - osiire’s blog
  • 1