サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
osiire.hatenablog.com
唐突にlock-freeをAlloyで書いてみたくなったので書いた。 what is lock-free 冬のLock free祭り safe from Kumazaki Hiroki www.slideshare.net kumagiさんの資料によると、lock-free stackはリンクリストみたいなもので、先頭へのポインタをCAS(Compare and Swap)で切り替えるらしい。 素直にAlloy化するとこうなる。 sig Data {} // linked elements of stack. sig StackElem { data:Data , next:lone StackElem // edge dosen't have next element. } { no next & this // prevent self pointing. } sig HeadPoin
本記事は関数プログラミングAdventCalendar2015 4日目の記事です。予定を変更してDBアクセス抽象化の話をしたいと思います。 pab_techさんによる二つの記事やtayama0324さんの記事でDBアクセスに対する抽象化が取り上げられています。 【ScalaMatsuriセッション当選御礼】ドワンゴ秘伝のトランザクションモナドを解説! Scalaにおける最適なDependency Injectionの方法を考察する 〜なぜドワンゴアカウントシステムの生産性は高いのか〜 Minimal Cake Pattern のお作法 ちょうど某プロジェクトでScala + Repositoryパターン的なものを利用しようとしていたので、参考にさせて頂きました。結論から言うと、うちの開発では「Minimal Cake Pattern」と呼ばれるものほぼそのままと、Readerモナドによるト
OCaml 4.02.0が出ましたね。PCを新しくしたついでにemacs 24系でOCaml環境を作った時のメモを置いておきます。 $ apt-get install opam $ opam init $ opam update $ opam switch 4.02.0 $ eval `opam config env` $ opam install omake ocp-index ocp-indent $ apt-get install auto-complete-el $ cat .emacs.d/ocaml.el (if window-system (require 'caml-font)) (setq auto-mode-alist (cons '("\\.ml[iylp]?$" . caml-mode) auto-mode-alist)) (autoload 'caml-mode
この記事は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
例題の仕様は次の通り。 b1,b2というボタンがあり、これらはON,OFFがあるトグルボタン。 modeというトグルボタンがある。 modeがOFFの時、b1とb2は排他的な動きをする(ラジオボタンのような動き)。 modeがONの時、b1とb2は独立なトグルボタンとして動作する。 clearボタンがあり、これが押されるとb1,b2はOFFになる。 これを普通(?)のイベントハンドラ風に記述するとこんな感じ。 type on_off = ON | OFF let flip = function ON -> OFF | OFF -> ON (* 状態を保存する変数. 初期値は全部OFF *) let mode = ref OFF let b1 = ref OFF let b2 = ref OFF (* getter, setterの定義. ここにUIへの反映処理なども記述できる. *) le
コードを単体テスト可能なよう保つためには色々なやり方がある訳ですが、一番いいのは副作用を分離して局所に押し込めておく手法でしょう。でも、処々の事情によりそんなに綺麗に分離する事もできないので、次善の策としては副作用部分をパラメーター化して別のモックに置き換え可能にしておくというやつがある訳です。そしてOCamlではそのパラメーター化の方法にも幾つかやり方があって、次の4通りの方法が考えられます。 副作用を行う部分を関数化して引数として渡す。 副作用を伴う部分が複数ある時はレコードにして渡す。 レコードの代わりにファンクター経由で渡す。 ファンクターの代わりに第一級モジュールで渡す。 例えばこういうコードを単体テスト可能にしたいとします。(単純化のため省略した関係で殆どなんのロジックもない関数になっていますが、実際にはもう少し条件分岐が入ったコードだと思ってください。) (* 単体テスト可能
8月15日にギークバーで使った資料をアップします。 レイトン教授で始める�Alloy Analyzer入門 View more presentations from osiire 資料に出てくる3つの問題のAlloyによるチートコードは次の通りです。さぁ、あなたもAlloyでレイトン教授の攻略を始めよう! //No50 enum Cow { A, B, C, D, E } sig Liar in Cow {} { #Liar = 3 } // ソーウ種は3匹 pred whoIsLiar { not A in Liar iff D in Liar not B in Liar iff C in Liar not C in Liar iff not A in Liar not D in Liar iff E in Liar not E in Liar iff B in Liar } run w
というタイトルの集まりが9月17日にありますので、皆様お誘いあわせの上ぜひお越しください。 函数プログラミングの集い 2011 in Tokyo 先日のこの集まりの打ち合わせの時に@ksknac氏がちらっとおっしゃっていたのが「関数型言語じゃなくて関数プログラミング」(超意訳です。しかも酔っていたので正しくないかも。) 確かに色々な機能を持つ言語を分類しても詮無い事ですし、C言語でオブジェクト指向的な事もできないわけではない訳で、特定のプログラミング手法というかスタイルがあって、それらと言語機能がかかわりあって存在しているという感じだと思えば、より正確で前向きな議論ができそうです。当然と言えば当然の話ですが、今後はこういう言い方を気をつけてしていこうかと思っている次第。 で、その関数プログラミングの手法とかスタイルとかって何なのか。もちろん定義がある訳ではないので、@kazu_yamamo
名古屋Ruby会議02の併設イベント、名古屋RejectでGADTの紹介をしたのでスライドをアップロード。なんか手元のスライドと比べて若干レイアウトが崩れているけど、気にしない。 GADTブランチの今View more presentations from osiire.
http://partake.in/events/5784afd8-d43b-4cbe-9256-430d5ababa2bに参加でゲソ。 この画像は、関数型イカ娘が触手を使って壁を侵略するゲームでゲソ。壁が下から上に強制スクロールするので、触手はそれを左右に避けて進むでゲソ!前にも見たことある人は気にしないでいいんじゃなイカ。今回は、このゲーム作成に使っているfunctionalなテクニックを紹介するでゲソ! ソースコードは、[ccell] View of /trunk/example/downdown.mlに置いてあるでゲソ。実際に動かしてみないと解説が分かりにくいかもしれないでゲソ。動画を撮ってアップする余力はosiireには無いんじゃなイカ?そういえば、触手を青くするのを忘れていて悔やんでいるでゲソ。 中央の触手は赤い部分が先頭で、そこから後ろの部分は先頭の矢印の軌跡でゲソ。そのロジ
オブジェクト指向なら分かるけど、モジュールでどうやってある程度の規模のプログラムをするのか、全く想像つかない!そんな諸氏のためにモジュールプログラミングのテクニックを、レベル分けしながら解説してみたいと思います。 レベル1(基礎編) アプリケーションで使う予定のデータや処理を大雑把にグループ分けして、それらに名前をつけて.mlファイルにします。個々の.mlファイルがモジュール、かつ、スコープ、かつ分割コンパイルの単位になるので、ある程度見通しがよくなります。モジュール同士の連携は、基本的にモジュール名を指定するだけ。後はその.mlファイルにシグネチャーを付けるもよし、つけなくても可。最後にmain.mlファイルを作って、そこからアプリケーションを起動するようにすればOK。とても簡単です。しかし、実を言うと、凝った作りのライブラリでもない限り、ほとんどこれで事足ります。大事なので二回言います
OCamlにはモジュールとクラスがあります。この二つの仕組みは、直感的によく似た機能を持っているので、どう使い分けたらいいのか迷う時があります。そこで、モジュールとクラスの使い分け方について少しまとめてみます。 基礎的なデータ/データ構造の場合 スタックとかキューとかグラフとか日付とか、内部構造を隠して操作だけを提供する、比較的基礎的な構造を作りたい場合です。この場合は、迷わずモジュールでいいです。ここをクラスにすると、バイナリメソッドで泣きます。 アプリケーションデータの場合 アプリケーション内で使う特定のデータ構造は、色々なデータの集合である事が多いので、大抵レコードになります。このレコードの代わりにクラスを使うのはありだと思います。逆に、これをモジュールでやると、内部型がないモジュールになって、オーバースペックな感じになります。もちろんレコードのままでいいなら、別にわざわざクラスにす
副作用を極力排除しようとするfunctionalな方向性の言語においては、GUIのような副作用の塊は扱えないという直観を持っている人も多いことでしょう。確かにfunctionalな言語でunit型を返す関数ばかり扱っていると、"普通に手続きを書いているのと何が違うの?嬉しくない!"という結論になるのは至極当然の事と思います。 でも、副作用を持つ部分と純粋関数の部分を切り分けて考えれば、意外とGUIの世界でもfunctionalなスタイルでプログラムが書けるのです。わかりやすい所でいうと、例えば、データベースを扱うプログラムも副作用の塊のように見えますよね?でも、SQL文を作成する部分は文字列を扱う純粋関数ですし、取得したデータがnullじゃないか、有効かどうかを判断しながら処理する部分もpureです。そうやってどんどん切り分けていくと、最終的にかなりpureになります。しかもpureになる
LexiFi 金融商品の開発環境。 メイン言語がOCaml。MLFiという専用言語もOCamlで作られている。 http://www.lexifi.com/ http://www.lexifi.com/downloads/frisch_inria_2008-12-15.pdf XenServerのツールスタック(xapi toolstack) 仮想化サーバーXenのツール群。全部OCamlらしい。 13万行 http://www.citrix.com/English/ps2/products/feature.asp?contentID=1686939 http://caml.inria.fr/pub/ml-archives/caml-list/2009/11/d80201600e5f91fbe48ce4856c034a71.en.html http://ocamlnews.blogspot
前回までで多相バリアントの基本的な機能は説明してきました。そこで今回は、多相バリアントのとても重要な応用についてお話したいと思います。それは、場合分け構造の拡張問題です。 場合分け構造の拡張は難しい 例えば、次のようなコードがあったとします。 module Card = struct type t = Num of int | Jack | Queen | King let num = function Num i -> i | Jack -> 11 | Queen -> 12 | King -> 13 end Card.tには4種類の場合分けがあり、それらに対してnumという操作が定義されています。このような場合分け構造+操作に対して、 静的で安全に(キャストせず)、 元のコードを一切変更せず、 新しい場合分けを加え、 新しい操作も加えた 新しい場合分け構造を定義する にはどうすればいい
私はOCaml, haXe, Scalaを勉強してきましたが、この三つの言語では構造的部分型がサポートされています。せっかくだから三言語の構造的部分型の特徴を比較してみることにしました。 OCamlは全て型推論してくれる代わりに部分型への変換は明示的。部分型変換ができるバリアントがある。 haXeは全て型推論してくれて、かつ部分型への変換も暗黙的にできるけど、場合によってはコンパイルがとまらない Scalaは型推論は(完璧には)してくれないけど、部分型への変換は暗黙的 全部違うのが興味深いですね。ところで、それぞれの型の表現も比べてみましょう。 (* OCaml版 *) # type t = [ `Const | `Var ];; (* 多相バリアント *) type t = [ `Const | `Var ] # type tt = [ t | `Exp ];; type tt = [
うちの会社(有限会社ITプランニング)でやってきたOCamlを使ったシステム開発の概要を書いておきます。ふと思うと今までまとめて公開したことはなかったなと。別に隠す程のものじゃないし、もしこれからOCamlを使ったプロジェクトを始めてみたい人の参考になれば嬉しいです。 2006年 某証券会社のWebサービスの一部を担当 株価を解析して、その結果をWebAPIとして提供。OCaml + MySQL。HTTPベースで提供されるXMLファイルが生データだったので、この時初めてXMLのパースにxml-lightを使った。これはかなり便利。その後も使い続けている。nc(network cat)ライクなモジュールも作った。行列変換のためにC言語との連携もしたけど、特に問題なし。そういえば、この頃はmarshalingが好きで、DBへmarshalingデータをそのまま保存して「Objectデータベース
ふと想うんですが、ある言語の「表現能力」ってうまく厳密に定義できないものですかね。それがあると言語の比較に便利じゃないですか。それが同型なら同じ表現能力と言えると。もちろんチューリング完全とか持ち出すとフラット過ぎるので、それはなしの方向で。もしかして常識?論文嫁? 例えば、アセンブラの変数には数字しか入らないじゃないですか。でも、少し高級な言語になると文字列も入ります(実質的にはポインタという数字しか持っていなくても、プログラマには文字列が入っているように見えます)。これは、なんか少し表現能力が高くなった気がする訳です。同様に、言語によっては、配列やリストやハッシュやセットやレコードやバリアントや関数やオブジェクトやS式や型やモジュールや証明を変数に入れることができます。要するに何が言いたいかというと、「第一級」さが「表現能力が高い」に関係している気がするのです。 一方で、express
以前OCamlは学習コストが低いといいましたが、私のOCaml学習の中で唯一多相バリアントだけはその意味を理解するのに時間がかかりました。ただ、分かってみると単純な話で、誰かが噛み砕いて説明してくれれば回り道しなくてもよかったのではないかと悔やまれます。また、多相バリアントについて集中的に解説しているWebページもあまりないので、ここで解説してみようと思います。 多相バリアントの基本 「多相」バリアントというくらいですから、多相バリアントは多相的なバリアントなのです。普通のバリアントは多相になりません。例えば普通のバリアント型、 # type card = Joker | Num of int;; type card = Joker | Num of int # type in_data = Str of string | Num of int;; type in_data = Str o
レコードと高階関数で書けるんだ!TAPLに載ってるのを読んで、へー(×2)と思ったので紹介するね!*1 # type t = { mutable name : string; mutable age : int };; type t = { mutable name : string; mutable age : int; } # type m = { get_name : unit -> string; get_age : unit -> int; birthday : unit -> unit };; type m = { get_name : unit -> string; get_age : unit -> int; birthday : unit -> unit; } # let obj = let self = { name = "osiire"; age = 20; } in
「Debian関連の方々の勉強会でOCamlをやったが、魅力がいまいち分からない(http://d.hatena.ne.jp/mkouhei/20090419/1240106632)」という話があるみたいですが、思い立ったので、私から見たOCamlの魅力、特にシステム開発の仕事で使うという視点から見たOCamlの利欠点について、ちょっと書いてみようと思います。まぁ、何が魅力かなんて人それぞれなのでアレですが。 まず、仕事で使う視点というからには最低条件を確認しておきます。つまり「魅力」以前に「使える」かどうかという事ですね。 OCamlには基礎的なライブラリ(入出力,コンテナ,DB接続,GUI,日本語,印刷,CGI,XML,正規表現,画像)は揃っています。足りないという人もいますが、それはスタンダードライブラリとして配布されていないからだと思います。 他の言語と比べて遜色ない速度が出せます
(いえ、どうせ前から広めたいとは思ってたので、ちょっと便乗。) これからマルチコア当り前時代になるし並行処理を扱えるようになりたい。でも並行処理って難し過ぎる。そんな諸氏に朗報です。簡単かつ安全にマルチスレッドを扱える方法があります。 それは、メッセージパッシングによるスレッド間情報共有です。Erlangのようなアクターモデルと言った方がピンとくる人もいるかもしれません。メッセージパッシングの世界にはロックもシグナルも登場しません。あるのは、スレッド間で共有する通信路だけです。なぜ通信路だけで、排他制御が出来るのでしょうか?新しいスレッドを作って、そのスレッドが持つ文字列を読み書きするメッセージパッシングスタイルのプログラムを見れば一目瞭然です。 (* 細かい事は若干単純化したサンプルプログラムです。*) let start_server init_msg = let ch = (* 通信
let id x = x let (@@) f x = f x let ($) f g x = f (g x) let (!$) = Lazy.force let (+>) f g = g f let curry f x y = f (x, y) let uncurry f (x, y) = f x y let flip f x y = f y x let rec forever f x = let v = f x in forever f v let spawn_loop f x = ignore (Thread.create (forever f) x) let maybe f x = try `Val (f x) with e -> `Err e let tee f x = try ignore (f x); x with _ -> x maybeとかteeとか普通に便利よー。
このページを最初にブックマークしてみませんか?
『osiire’s blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く