OCaml

アクセス制御の抜け穴 (OCaml編)

Obj.magic 最強、で終わらそうと思ったのですがそう単純な話でもないらしい。 まず OCaml の private メソッドは、Javaなどのprotected相当で、継承した先のクラスからアクセスすることができます。 しかし呼び出せるのは自分に対してだけで、引数として受け…

53./.100.*.100.

53(ゴサ) になっているのは駄洒落? http://blog.livedoor.jp/dankogai/archives/50776331.html Objective Caml version 3.09.2 # 53. /. 100. *. 100.;; - : float = 53. # int_of_float (53. /. 100. *. 100.);; - : int = 53

記号論。

大なり">" 小なり"演算子として使われるので、多相ヴァリアントの型を見ていると、微妙に違和感を感じる。うーん、でも型も集合みたいなもんだからなぁ。 [> `A | `B] を集合として { S | S ⊃ {`A, `B} } と読んでしまえば、"⊃" は反射律を満たすものだと思…

OCamlで無限リスト。

OCamlのLazyモジュールで遊んでみました。 とりあえず、lazy (OCamlの予約語) と Lazy.force だけ覚えておけばよさそうです。 lazy 'a -> 'a lazy_t *1。 'a lazy_t なる、文字通りlazyな型を作り出す。 Lazy.force 'a Lazy.t -> 'a。 Lazy.t (=lazy_t) の皮…

ファンクタについて。

OCaml のモジュールシステムは強力ですよという話。関数が値を受け取って値を返すように、 functor は structure を受け取って structure を返す。 値 型 関数 let x : t = 〜 type t = 〜 let f (x : t) : t = 〜 structure signature functor module M : S…

ちゅーとりある

諮問会が終わってからというもの、超まったりモードです。旅の予定を立てたりなんかして。 今日はOCaml チュートリアル読んでました。 begin ... end って、単に括弧の syntactic sugar に過ぎないのかー。 へー、と思った module の使い方。 In the ocaml t…

演算子

演算子を自分で定義するときの話。 Haskell は infixr とかで結合の向きと強さを指定できたりしますが、OCaml の場合は中置演算子の結合規則や優先度は 先頭の記号によって決まります。 例えば +: のような + で始まる演算子は全て + と同じ強さで左結合。 …

if を関数として実装

Haskellは必要呼出し、OCamlは値呼出し {- Haskell -} myIf :: Bool -> a -> a -> a myIf True t e = t myIf False t e = e main = myIf True (putStrLn "then") (putStrLn "else") ---------- 実行結果: then (* OCaml *) let myIf c t e = match c with tr…

echo

{- Haskell -} import System main = do args <- getArgs putStrLn $ unwords args モジュール すべての関数や変数はモジュールに所属する import宣言でインポートする Main module main変数を含むモジュール デフォルトでは、外部にmain変数だけを公開 Prel…

map関数

{- Haskell -} map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs (* OCaml *) let rec map f = function [] -> [] | x :: xs -> f x :: map f xs

Haskell OCaml 整数 Int int 文字 Char char 文字列 String = [Char] string 真偽値 Bool(True) bool(true) 型aのリスト [a] ([1, 2, 3]) a list ([1; 2; 3]) 型変数 (a, b, c) ('a, 'b, 'c) ※ ()内はリテラルの例多相型: 型変数を含む型 型宣言 {- Haskell …

cat

{- Haskell -} main = do cs <- getContents putStr cs do 式を束ねる。上から順に実行。 オフサイドルール Pythonのようにインデントが意味を持つ " getContentsアクションの結果入力された文字列に変数を束縛する。 : getContents , putStr cs (* OCaml *)…

Hello, World!

{- Haskell -} main = putStrLn "Hello, World!" 変数mainを定義 アクションは、評価することで副作用を起こす。 Haskellプログラム実行 = main変数の評価 : putStrLn cs (* OCaml *) let _ = print_endline "Hello, World!" 見た目は殆ど一対一に対応する