サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
TGS2024
camlspotter.hatenablog.com
OCaml 4.02 に追加された新しいモジュール型、 (module M) が結構いけているのです。 OCaml である既存のモジュールの型は?というと、 module type of M というのがあって、 module type of Unix とやると Unix モジュールの signature を貰えるというものでした、が、これがあまり使いたいときに使えないものでした。 OCaml で既存モジュールに何か関数を足したいことがあります。特に元から付いている標準のライブラリは足りないものが多すぎる。たとえば Unix.usleep が欲しい: module Unix = struct include Unix let usleep x = ignore (select [] [] [] x) end はい、簡単にできました。ではこのオレオレ Unix の型を書きたい。これは元の Un
開発者アカウントに金が出せない貧乏人の方々が、次の Apple の Swift のコードの挙動がわからない、というので盛り上がっております: let a = [1,2] // a = [1,2] var b = a; // b = [1,2] b[1] = 3; // a = [1,3] b = [1,3] b.append(5); // a = [1,3] b = [1,3,5] b[1] = 4; // a = [1,3] b = [1,4,5]もちろんわたしも貧乏ですからわかりやすい炎上案件を待っておるわけです。これはわかりやすいわからないが来たね。 だいたい b[1] = 3 とやると a[1] も変化する、これがわからないという人 b[1] = 4 とやると a[1] が変化しない、これがわからないという人 二種類いるようです。私はまず、 b[1] に代入できることがわかりません
普段パクリにはうるさそうな連中が Apple 様がパクルとスルーして嬉しそうにしているので、ああ所詮はそういう人達なんだなあと思って拝見しております。 元祖 Swift parallel scripting language: http://swift-lang.org/ アイコンまでクリソツなのでもう駄目ですね。 まあ元祖が Hello world の例さえ動かないのはちょっと悲しいですね…
そもそも「関数型言語」という言葉自体、どうなんやいうのもあるんですけど http://www.slideshare.net/ksknac/120901fp-key とある純粋関数型言語の特徴でもって「関数型言語ではー」とか言われると、非純粋関数型言語のユーザーとしては(いやお仕事では純粋関数型言語使ってますけどね)もにょっとしてしまうんですよ 関数型言語は遅延評価だから、すばらしい/クソだ (いやいや純粋関数型言語でも先行評価の言語あるからー、あんたのは違うかもしれんけどよー 関数型言語は副作用が状態がないので、すばらしい/クソだ (いやいやまず純粋関数型の人たちでまず副作用が何指してるか決めてから来てよー 関数型言語はインデントで意味が、型クラスが、、、すばらしい/クソだ Haskell の話なら Haskell ではーとか、やっぱり GHC だね!とか書いてよ!「アジアではー、ニンジャ
いやまじで使っちゃいけないです。 三年前こういうことがあったんです。 Haskell と C++ を使っているコードなんですが、 突然ビルドができなくなる。さっきまで上手く行っていたのに、意味不明な C++ のエラーがゴボゴボ出てくる。 git status や hg status してもそんなとこ何も触ってない。そもそも C++ なんか触ってねえし、俺触ってたの Haskell だし! 変更を全部元に戻してビルド ⇒ やはり意味不明な C++ のエラー。エラー行数が多すぎて読む気も起きない。俺は C++ 専従じゃねえからこんなもん読めるか! make clean してフルビルドしなおすと…やはり C++ のエラー。ふんぎーーーーー!!! ビルドできたはずのコードに戻して make clean してもビルドエラーが出るわけ。まさに「何もいじってないのに壊れましたぁ」状態。ほら、さすがにプロ
OCaml 演習とかやってひぃひぃ言っている人対象ですぅ。わからない人にはわかるように書いていませんから、「さっぱりわからない」とか呟く前にスルー推奨です type t = int list list list let x : t = [[[1]]] let y = x @ x をコンパイルすると、 x は t だが y の型は int list list list とレポートされる。これが残念だって話。だって明らかに t でしょ? これはもちろん単一化アルゴリズムの気持ちになれば明らかに、明らかではないのだが… それに、じゃあ x @ x の型が t としてレポートされるべきかというと、そうではないわな。 type kg = float type m = float (* メーテル *) let bmi (w : kg) (h : m) = w /. (h *. h) としたときに bm
Haskell の実装 GHC の新しめのバージョンでは 多相let の型付けが今までの HM (Hindley Milner) 方式から新しい OutsideIn(X) に変わっています。(言語拡張でどうたらあるらしいがシラネ) 詳しい動機はまあいろいろあるみたいですが GADT とか Type family の型推論の効率とか完全性とかそういう方面らしいです。正直両方とも使わないのであまりありがたみがわかりません。で、世の中 Haskell のやることは外でも全て正しいという考えの方がおられまして、 OutsideIn(X) は Haskell で問題ないのだから他でも問題が無いはずだとかおっしゃるわけです。 あんまり科学的な態度じゃないですよね。まあプログラミング言語論のこれは便利だ便利じゃないなんて思想であって自然科学じゃあないので究極的には好き嫌いの問題だと私は思うからまあいいっ
関数型言語というと金融で流行っている、特に OCaml と言えば金融御用達関数型言語として語られることも多い。金融業界に関数型言語を持ち込み成功した最初の二社 LexiFi とJane Street Capital は共に OCaml を採用し、そして二社とも今日成功しているからだ。 今回はそのうち LexiFi について話したい。私が Ph.D を取った後、一年間、産業ポスドクとしてお世話になった会社である。 金融派生商品(デリヴァティブ)は様々な日時や条件、依存する別の商品価格によって価値が変化する。デリヴァティブは先物やオプションなどのような一般市場でも流通している簡単な派生商品だけでなく、会社間でだけで取引される非常に複雑な物もある。これらの商品にはそれぞれ業界内で通用する名前が付けられ取引、評価、管理が行われてきた。そしてこれらを扱うプログラムもまた、それぞれの商品ごとに別個の機
違うバージョンのコンパイラを違うバージョンのライブラリセットに対し間違って使ってしまった コンパイラが変われば元のコンパイラで作成したオブジェクトやライブラリは新コンパイラではまず使えない clean せよ which ocaml / which ocamlc / which ocamlopt ocamlc -where /ocamlopt -where でライブラリディレクトリを確認 env | grep -i caml で各種ディレクトリの指示先が使っているコンパイラと齟齬が無いか grep -i ocaml ではなく caml であることに注意 $PWD/.ocamlinit $HOME/.ocamlinit が何か悪さをしていないか strace でどのファイルをなめているか見る 他人の作ったバイナリディストリビューションは信用しない
表題の様なことがちょっと気になったので、型無λ計算の big step semantics (戦略は正格評価)を実装しました。まあ要するにしょぼいインタプリタですね。 FP でλ計算を実装する まず、普通に関数型言語(OCaml)で実装してみました。 λ式の型は t (term) λ式には整数定数と加減をプリミティブとして追加 λ式を評価すると value になる(計算止まらない場合はさようなら) value には引数を待っているプリミティブがある open List (** primitives *) type prim = Add | Sub (** terms *) type t = | Int of int | Var of string | App of t * t | Lambda of string * t | Prim of prim (** semantic values
これは 2013年7月の旅行記です。 (面倒なんで東南アジア方面用語は解説しません。ググッておくれー) うちの息子の毎度曜日のスイミングが先生の夏休みで二週間なしになりました。で、急に旅行してみようということになりました。アンコールワットとか見に行こうかとも思いましたが、急に旅行というとなかなかプラン立てづらそうな重量級ターゲットなのでパスして、近めでちゃっと行ってちゃっと帰れるところにしようということになり、シンガポールから直行便のあるペナン (http://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%8A%E3%83%B3%E5%B7%9E) にしました。 ペナンは檳榔島とか檳城とか書かれますが檳榔樹の産地だったようです。ペナン州の旗にもこの椰子科の木の絵が描かれていますね。ペナン博物館にも檳榔セットが飾ってありました。一度やってみたいものですが、ペナン
OO の方面から、「静的型とか別に役に立つとは思えない、静的型の人は頭おかしい」 とか関数型の方面から、「静的型が役に立たないなんてはずない OO の人は頭おかしい」 とか良く聞こえてくるんですが、ダックタイピング心理学 とかいう真に頭おかしい意見を無視できるとすると(無視できない量あるんですが)、まあ私にはどっちもわからんでもない、という話です。 型をゴミ箱に捨てておいてから、後でゴミ箱を漁るなら、型なんかいらない オブジェクトの静的型システムを大雑把にいうとまず upcast と downcast があります。 upcast はオブジェクトの静的型をそれが属するクラスからそのスーパークラスにを変えちまうこと、downcast はその逆、オブジェクトの静的型をそれが属するクラスから子クラスに変えちまうことです。サブクラスの物はスーパークラスとしても通用するはずですから upcast は失
糖衣構文で可能 (P4 マター) 関数にする (.[1]) (.[]) (.(1)) (.()) (.field) (#meth) (,,,) どんどん関数にする (.[]<-) (.field<-) などなど もっともっと関数にする {.. with x = e} など (.. が無いとさすがに怖い) 糖衣構文ではできない (コンパイラ改造コース) open M の名前の一部を隠蔽 SML 方式のオーバーローディング SML の #2 のようなもの (OCaml では #2 は行番号指定記号なのでこの書式は使えない)
スペルチェック 識別子のミスタイプがあった場合訂正を提案します: # List.lentgh ;; Characters 0-11: List.lentgh ^^^^^^^^^^^ Error: Unbound value List.lentgh Did you mean length? 個人的には、はあだから?と言った感じかと思っていたのですが、今のところスペルミスを指摘されるとそれはそれでうれしいことが判明しております。 Parser rewriter -ppx CamlP4 がヘビー過ぎて使えないという虚弱体質な人のために新しい -ppx という物が入りました。はっきり言うと P4 をマスターしている 人には機能が縮小されたものなので嬉しくありません。 まあ使い慣れた Parsetree のレベルでいじれるのが幸いですが… ocamlc -dsource コンパイラが受け取ったパース
OCaml のオブジェクトファイル(.cmo, .cmx)を並べる順番には意味がある。 順番を間違えると: Reference to undefined global Hogehoge などと言われるので注意。 a.ml: let x = 1 b.ml: let y = A.x c.ml: let z = B.y というソースがあったとする。 a.ml, b.ml, c.ml の順に分割コンパイルする。これは問題ない: $ ocamlc -c a.ml $ ocamlc -c b.ml $ ocamlc -c c.ml さて、これをリンクする場合、依存関係の順にリンクしなければいけない: $ ocamlc -o a.out a.cmo b.cmo c.cmo # a.out 実行ファイルへとリンク これを間違えると Reference to undefined global Hoge
List, Array, Record などの要素区切りの ; はとても奇妙に見えるかもしれない。 OCaml を使っている人でもあまり意識していないのだが、実は一貫性がある。 A ; B は B ; A と書いても型は変わらない A , B は B , A と書くと型が変わる場合がある 例: print_string "hello"; print_string "world" { a = 42; b = "hello" } [ 1; 2; 3 ] [| 1; 2; 3 |] これらの要素を入れ替えても型は変わらない。もちろん意味は変わる場合がある。 例: (1, "hello") (int, float) Hashtbl.t これらの要素を入れ替えると型が変わってしまう。
例外による再帰関数からの大域脱出は OCaml ではランタイムのペナルティはほとんどない、 という事になっている。 try with を書いてそれでもコードが読みやすければ使って構わない。 が、実際のところ、どうか。 -g を付けてコンパイルした場合、遅くなる。 さらに、 OCAMLRUNPARAM 環境変数に "b" が入っていると更に遅くなる。 しっかりした OCaml プログラムを開発したい場合はバックトレースは是非欲しい ところなので、 -g を付けて OCAMLRUNPARAM 環境変数に "b" を入れてプログラム を実行することは普通にある。だから、安易に例外を使うとパフォーマンスに影響する: let gen_timed get minus f v = let t1 = get () in let res = f v in let t2 = get () in res, mi
一番よいのは CamlP4 が何を出力しているか見ることです。 例として OCamltter の Twitter API の JSON 表現と OCaml の型との間を取り持つ api11.ml がどうなっているか見てみましょう。 type 'a t = { previous_cursor : Json.t; next_cursor : Json.t; next_cursor_str : string; previous_cursor_str : string; contents : 'a mc_embeded; } with conv(json, ocaml) この型宣言の with conv(json, ocaml) の部分は CamlP4 の拡張の部分で、型定義からなにかしらコードを生成しています。 $ rm lib/twitter/api11.cmo $ omake --verbo
A rough summary in English which might sound too more direct than the original Japanese version. Sorry if you feel attacked: pro came in and did great jobs, while a volunteer felt burnt out. Probably this kind of things happens in the world everyday, in OSS, in football, in finance, or in everything. But if he had been excluded from the project for pro's quick market domination..., it would not be
一昨年から少しずつ書かれていた OCaml プログラミングの本、 Real World OCaml (以下 RWO)がついに public beta になり公開されました。 ( https://realworldocaml.org/beta1/en/html/ ) 版元の O'Reilly ではこのベータ版の状態の e-book が 今なら安く手に入ります。完全版には後から無料でアクセスできるように なるそうです。( http://shop.oreilly.com/product/0636920024743.do ) !!!!!安く買いたい人は http://shop.oreilly.com/category/deals/early-release.do?code=WKERRLS をよく読んでね!!!!! この本は、今まで外に伝わりづらかった OCaml プログラミングの最前線の一面を 伝
http://oshiete.goo.ne.jp/qa/7896221.html にこういうのがあった: 情報系の大学3年生です。 僕は関数型言語に興味がありhaskellやlispを勉強しています。 ... 昨今のIT企業は新卒採用の際、学生時代に作ったプログラムを評価し採用の是非を決めると思います。 もし関数型言語で何か作っても評価されるのでしょうか。 僕ができることといえば、本やサイトに載ってあるサンプルを少し改良するぐらいです。 そんな作品を企業側が積極的に評価し、採用してくれるでしょうか。 ... 自分で考えるべきことでしょうが、調べるばかりで頭が混乱して日常生活に支障がでてきてます。 全文はリンク先を見て。 答えようと思ったが、ログインとかユーザ登録とか実にアホラシイのでここに書いておく。 関数型言語は実用的かどうかについて 関数型言語を実用に使っている人は、実用的だと思って使
OCaml の「1モジュール1データ型スタイル」。このプログラミングスタイルは21世紀に入ってからモジュールを多用する OCaml コミュニティで流行りだしたもので私も採用しています。源流は SML 方面にあると聞きましたが…私自信は確認していません。要出典です。 「1モジュール1データ型スタイル」の意味するところは簡単です: データ型一つ一つにモジュールを一つ一つ作る。 モジュール名は型の意味する名前をつける。人なら Person。 モジュール内で定義するデータ型は常に t という抽象的な名前にする。 t を主対象とする操作はモジュール内で定義する。 ただし、全ての OCaml プログラムはこのように書かれるべし、というものでもありません。 例えば、 OCaml のコンパイラのソースコードはこのスタイルでは全く書かれていません。 「1モジュール1データ型スタイル」の利点は: モジュール名
2012年12月での関数型言語 OCaml コンパイラ一式には入っていない 内部もしくは外部開発されたのツール群の紹介を行う。 例によって多岐に渡るので、一つ一つの詳しい説明は行わない。 各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。 リンクは貼るの面倒だからググって。 もし知らないツール名があったらちょっと読んでみて欲しい。 もしかしたらあなたの問題を解決するツールがあるかもしれないから。 ライブラリとツールの中間のようなコード生成系も取り上げた。 あくまでも基本的に私が触ったことのある物しか紹介しないから、 そっけなかったりするのはあまり触ってないということ。 なんでこれはなんで取り上げてないの?と思ったら、それは使ったことないから。ごめんね。 不満があったら自分で紹介記事書いてください夜露死苦! ★は重要度。五点満点。 コンパイラ同梱のツールの紹介はもうした。 htt
Web にアクセスするプログラムを書いていると良く JSON というデータを扱う ことがあります。JSON とは世間で何と言われているかわかりませんが OCaml では: type t = | String of string | Number of float | Object of obj | Array of t list | Bool of bool | Null and obj = (string * t) list 簡単ですね。まあ S式に毛の生えたようなものです。 型の無い世界の人はこの簡単な型でもって、何でもかんでも表現しているみたい。 例えば、このデータは必ず整数リストだという仮定があっても JSON では本当に データが整数リストであるか、どうか、確かめなきゃいけない。大変ですねー。 じゃあ OCaml だと楽かというと、やっぱり大変です。 JSON のデータをパースし
2012年12月での関数型言語 OCaml コンパイラ一式をインストールした際に付属する「公式」ツール群の紹介を行う。多岐に渡るので、一つ一つの詳しい説明は行わない。各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。 もし知らないツール名があったらちょっと読んでみて欲しい。もしかしたらあなたの問題を解決するツールがあるかもしれないから。(特に caml-types.el) ★は重要度。五点満点。 外部ツールの紹介はまた今度ね。 錦小路と堺町通のあたりで見かけた。見ただけなんでイタリアンで駱駝なのかはわからない。 OCaml コンパイラ 現時点での公式最新バージョンは 4.00.1。 4.00.1 は基本的に 4.00.0 のバグフィクスリリース。 4.00.0 では GADT と 3.12.1 より使い易い first class module が入っている。 このところ OC
OCaml 4 に付属する compiler-libs を使うと、以前より手軽に OCaml コンパイラを改造することができます。(できないこともありますが) https://bitbucket.org/camlspotter/compiler-libs-hack に、SML スタイルの多重定義を実現するコードと解説記事を置いておきました。 英語なんですけど私が普段書いている英語なんてこんなもんです。
このところ立て続けにコードレビューについて話をする機会があったので 私が経験した最高のレビュー体制を簡単にまとめておこうと思います。 利点 何故必要か 何が嬉しいのか コスト うまく回すためには何が必要か 細かい運営方法 はっきり言って当たり前の事しか書きません。 私も当時は当たり前のことだと思っていましたから、特に気にもしていなかったのです。 ただ見聞するところによると、これをちゃんとやっているところはとても少ないようです。 ウォールストリート系のファンドでもろくにレビューしてないとかどういうことなんでしょう。 だから時々会社が吹っ飛ぶんですね… 結局は、ああだ、こうだ各論を言っても、ちゃんとやれるのか、それ一点に尽きてしまう話なのですが… 利点 レビューを何のためにするか、それはまず第一に自分達の書いているコードに潜在するバグによる損失をできるだけ少なくすることでしょう。 型システムや
さて、お約束していた OCaml の型エラーメッセージ改良のための改造、ある程度形になりましたので、公開します。 hg clone -b typeloc https://bitbucket.org/camlspotter/mutated_ocaml ビルドは configure の後、 make core coreboot world です。インストールなさる場合は既存の OCaml システムを潰さないように注意してください。インストールなしにトップレベルを試したい場合は ./ocaml -I stdlib 。といってもまだコンセプトが理解できる程度にしか動作せずまだまだ不完全です。バグもあるかと思います。 さてここから簡単にアイデアを説明します。MLの型推論についてある程度の知識が必要です。 HM 型システムではプログラムの各所を見ながらそれぞれが要求する型の情報を制約として集め、解の存
良心が咎めないことも無いので… 各関数型言語(らしきもの)のホームページには大体、ウチの言語はこの会社で使われているよ!だから君も使わなきゃ駄目駄目!というお手盛りのページがあります。それをペペッとググリましたので列挙しておきます: Scala: http://www.scala-lang.org/node/1658 Clojure: http://dev.clojure.org/display/community/Clojure+Success+Stories Haskell: http://www.haskell.org/haskellwiki/Haskell_in_industry F#: http://msdn.microsoft.com/en-us/vstudio/gg634701#Who_Uses_F_sharp OCaml http://cufp.org/archive/20
次のページ
このページを最初にブックマークしてみませんか?
『camlspotter’s blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く