Questions tagged [ocaml]

OCaml は関数型プログラミング言語のひとつです。ML 言語族のひとつであり、静的型付け、非純粋、先行評価を特徴とします。

OCaml は次のような特徴を持つML言語族に属するプログラミング言語です:

  • 関数型
  • 静的型付けによる型安全性
  • 効率性のための副作用を排除しない
  • 先行評価
  • 強力なモジュールシステム

他の ML 言語族と比較するとさらに次のような機能があり、どちらかというと理論よりも実用よりの言語実装となっています:

  • クラスやオブジェクトを扱うための構造的サブタイピング
  • 型定義を必要とせず、やはり構造的サブタイピングを持つ多相バリアント
  • ラベル付き引数
  • バイトコード出力とネイティブコード出力の両方を行える

OCaml に関するより詳しい情報は http://ocaml.org などから得ることができます。また日本語コミュニティとして Slack があります: https://slackin-ocaml-jp.herokuapp.com/

35 questions
10
votes
2 answers

OCamlの ; と ;; の違いが分からない

.mlファイルの中のOCamlコードで、以下のようなコードを書いた際、 let print_for_print_test str = for i = 0 to String.length-1 str do print_string(str) print_newline() done;; 3行目に ; が足りない、という意味のエラーメッセージが出ました。実際に ; を補えばうまくいったのですが、OCamlでの ; と ;;…
lastcat
  • 101
  • 5
9
votes
3 answers

polymorphicなopen recursionを作りたい

OCaml 4.02で導入されたExtensible variant typesを使ってexpression problemの解のようなものを書いていた際、polymorphicなopen recursionが欲しくなりましたが、書けなくて困っています。 module Lang = struct type 'a expr = .. type 'a expr += Num : int -> int expr | App : ('a -> 'b) expr * 'a…
5
votes
1 answer

OCamlでのscanf後のread_lineがEnd_of_fileを生じる理由

test.ml: let () = begin Scanf.scanf " %d %d " @@ Printf.printf "scanf : (%d, %d)\n"; for i = 1 to 2 do print_string "read_line : "; print_endline @@ read_line () done end input.txt: 12 34 hello world this is a test として、cat input.txt…
CoiL
  • 53
  • 3
5
votes
4 answers

任意の要素をリストの最後に追加したリストを作成する方法

OCamlでコードを書いているときに、リスト操作をすることがあるのですが、 4 :: [1; 2; 3];; みたいに、 リストの先頭に対して要素を追加したリストを作成する方法はわかるのですが、リストの最後に対して追加したリストを作る方法がわかりません。とりあえずの方法として: [1; 2; 3;] @…
esehara
  • 1,383
  • 1
  • 13
  • 26
4
votes
1 answer

OCamlのExtLibのEnum

OCamlのライブラリExtLibの中のEnumについて質問します。 以下を実行しました。 open Printf let tee f e = let e' = Enum.clone e in f e'; e let term e = Enum.iter (fun _ -> ()) e let f e = Enum.map (fun inp -> let out = inp * 2 in printf "in…
hmltn
  • 43
  • 3
4
votes
1 answer

OCaml のクラスにポリモーフィックな map メソッドを持たせたい

次のようなmapメソッドが作れなくて困っています class ['a] my_ref (x_init : 'a) = object val mutable x = x_init method get = x method set y = x <- y method map : 'b. ('a -> 'b) -> 'b my_ref = fun f -> new my_ref (f x) end エラーメッセージは Error: The universal type…
Kik Kik
  • 43
  • 4
3
votes
1 answer

パターンマッチを合成するには?

Extensible variant…
3
votes
1 answer

ppx コマンドの簡単な呼び方を教えてください

OCaml で ppx コマンドを呼び出す際に ocaml -ppx `ocamlfind printconf path`/ppx_test/ppx_test として ppx コマンドを指定しているのですが、より良い方法はありませんか? ※ 環境は Mac OS X です。ppx は OPAM からインストールしています。 追記 $ ocamlfind ocaml -package ppx_test または、 $ ocamlfind ocaml -package…
櫻井洋志
  • 117
  • 6
3
votes
1 answer

Unix.fork を呼ぶと fork 前のトップレベルの式が再度実行されてしまう

Unix モジュールの fork 関数を呼ぶと、 fork 前のトップレベルの式が再度実行されてしまいます。 fork 前のコードを fork 後に実行されないようにしたいのですが、どう修正すればよいのでしょうか。 コード: let () = Printf.printf "hello, world!\n"; ignore @@ Unix.fork () 実行結果 (ネイティブコードにコンパイルしての実行です): hello, world! hello,…
3
votes
1 answer

OCamlにCのような行コメントはないのでしょうか。

Cなどでは // 以降、行の終わりまでがコメントと見なされますが OCamlにはこのような終端記号の不要な行コメントはないのでしょうか。 ない場合、なぜないのか、自分で定義するにはどうすればよいかについても 教えていただけると幸いです。 どうぞよろしくお願いします。
watagumo
  • 45
  • 6
2
votes
1 answer

OCamlYaccやMenhirでコンフリクトを消す方法

OCamlYaccやMenhirを使ったりするのですが、コンフリクトが発生した場合の解消はトライアンドエラーでなんとなく消しています。 何かツールの使い方やコツ等ご存知の方いましたら教えてください。
櫻井洋志
  • 117
  • 6
2
votes
1 answer

ppx版のsexplibで旧来の<:sexp_of<型>>に相当するものはあるのでしょうか?

新しいOCamlではCamlp4の代わりにppxが使われるようになり、Real World OCamlにあるようなS式を取り扱うコードも一部適用できなくなったことを知りました。例えばwith sexpの代わりに[@@deriving sexp]と書く、といった具合です。 # require "ppx_sexp_conv";; # type some_type = { foo: int; bar: string } [@@deriving sexp];; type some_type = {…
letrec
  • 3,170
  • 1
  • 14
  • 34
2
votes
1 answer

opamがstack overflowを吐くようになってしまいました。

opamでいろいろパッケージをインストールしていたのですが、パッケージのインストールは成功したものの、その後opamが Stack overflow を返すようになってしまいました。何か解決方法はありますでしょうか。 $ opam update =-=- Updating package repositories =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [default] synchronized from…
yozenam
  • 63
  • 4
2
votes
2 answers

OUnitをできるだけ簡単に実行するための方法

OCamlでコードを書くさいに、ユニットテストを書きたいため、OUnitを利用しています。 そのとき、foobar.mlとfoobar_test.mlといったように、ファイルを分けているのですが、ドキュメントを見る限りですとユニットテストを実行する方法として: ocamlfind ocamlc -o test -package oUnit -linkpkg -g foobar.ml…
esehara
  • 1,383
  • 1
  • 13
  • 26
2
votes
1 answer

ocamlfindがcompiler-libsを認識して名前が被るモジュールがコンパイルできない

ocaml 4.02.3において、以下のコマンドでlongident.mlというファイルを コンパイルする際に下で示すエラーが表示されました。 longident.mlの中身はtype t =…
nomaddo
  • 55
  • 6
1
2