◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:関数型言語ML (SML, OCaml, etc.), Part 6->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1245017721/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
関数型言語MLについて語るスレッドです。
MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML
http://www.smlnj.org/ Objective Caml
http://caml.inria.fr/ocaml/ 前スレ
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/ プログラミングの初心者が最初に学習する言語としても優れているのに、 学習者が増えないのはなぜなの?
>>2 初心者が日常で使うにはハードルが高いからかな
前スレでもあったけどOcamlとHaskellってどっちが初心者に向いてるのかな? Lispいじってた俺にとってはOcamlの方が見た感じ楽そうに見えるけど Lisp、Ocaml、Haskellマスターの意見が聞いてみたいな
standard MLをさらっとやってから決めれば。
>>5 型つき関数型言語の背景にある背景理論(ラムダ計算)をぱっと勉強したいならHaskell,
実用で長いこと使いたいならOCaml。
オブジェクトを使わずにステートマシンを作るのによい方法はありますか? 勉強のためにStateパターンをモジュールを使ってやってみようと思ったのですが、 相互依存を回避するうまい方法が思いつきません。 また、状態をそれぞれ別モジュールにするにせよ、一箇所にまとめるにせよ、動的に切り替えるためには 結局パターンマッチさせてそれらを呼び出すようになると思いますが、もっとスマートな方法はありますか?
うん、なんか簡単な問題例を出してくれないとわかんないよ。
state machineの問題例というとよくあるのはストップウォッチとか。
実際の問題を簡単にした問題例です。 流れ: キャラクタがバイトをして財布がいっぱいになったら銀行へ行く ということを目標金額まで繰り返し、到達したらその金がなくなるまで 家でごろ寝し、なくなったらまた働く キャラクタは ・バイトをする : 手持ちが1増える ・銀行で貯金をする : 手持ちを0にし、貯金が1増える ・家で寝る : 貯金が1減る の状態を取ります。 財布の許容量は3、目標貯金額は5とします。 Ocaml的な解決方法のアドバイスをいただけると幸いです。 ちなみに元々の問題は「実例で学ぶゲームAIプログラミング」 という本の2章に出てくる、上記の問題例にいくつか余分な状態を 追加したようなものです。 元々の問題をとりあえず実装してみたソースとサンプルソースも あげてみました。 http://www1.axfc.net/uploader/Sc/so/9827.lzh スレ違いではありますが、もう1つ後学のために質問をさせてください。 アップロードするのは初めてでよくわからないままaxfcを 使用したのですが、プログラム板で一般的に使用されている アップローダーというものはあるのでしょうか?
>12 その手の奴って素直に状態保持した方が色々スッキリしそうなんだけどどうなのエロイ人
>>12 > キャラクタは > ・バイトをする : 手持ちが1増える > ・銀行で貯金をする : 手持ちを0にし、貯金が1増える > ・家で寝る : 貯金が1減る > の状態を取ります。 ニート解: キャラクタはバイトせず取り敢えず銀行へ行く ということを目標金額まで繰り返し、到達したらその金がなくなるまで 家でごろ寝し、なくなったらまた働かずにまた銀行へ行く なんで12の問題にStateパターンが適してるのかよくわからない。。
interface State { void whatToDoNext(); } みたいなインターフェイスがあって、 class RichState implements State { public void whatToDoNext() { goToTheBank(); } class PoorState implements State { public void whatToDoNext() { work(); } ... みたいなイメージですか?
これくらいなら引数に状態を持たせて各状態を手続きで表せばよくね?
>>20 のやり方がいいんじゃねーかな
たぶん
>>16 も同じこと?
たぶん両者が言ってるのはこんな感じ?(1/2)
type action =
| Work // バイトをする
| Deposite // 銀行で貯金をする
| Rest;; // 家で寝る
type life_state =
| Working // …ということを目標金額まで繰り返し
| Resting;; // ごろ寝
let sigma event state =
match (event, state) with
// バイトをする: 手持ちが1増える
| (Work, (budget, account)) -> (budget + 1, account)
// 銀行で貯金をする: 手持ちを0にし、貯金が1増える
| (Deposite, (budget, account)) -> (0, account + 1)
// 家で寝る: 貯金が1減る
| (Rest, (budget, account)) -> (budget, account - 1);;
(2/2) let rec life state days = printfn "%A" (state, days); if days = 0 then () else match state with // 財布がいっぱいになったら銀行へ行く | (Working, (3, account)) -> life (Working, sigma Deposite (3, account)) (days - 1) // ということを目標金額まで繰り返し | (Working, (budget, 5)) -> life (Resting, sigma Rest (budget, 5)) (days - 1) // (財布がいっぱいになるまでは働く) | (Working, s) -> life (Working, sigma Work s) (days - 1) // 到達したらその金がなくなるまで家でごろ寝し、なくなったらまた働く | (Resting, (budget, 0)) -> life (Working, sigma Work (budget, 0)) (days - 1) // (なくなるまではごろ寝する) | (Resting, s) -> life (Resting, sigma Rest s) (days - 1);; 改行が…まぁいいか ちなみにF#です
>>16 継続について調べてみます。
>>17 ありがとうございます。今度コードを晒すときに使ってみます。
>>19 おそらくそのイメージで合っていると思います。
(とはいってもJavaはよくわからないのですが・・・)
トップレベルでキャラクタクラスのUpdateを呼び出すと、保持している
派生状態クラスのインターフェースに自身を渡して実行。あとはよろしく。
状態の切り替えも勝手にお願いね。
的なコードが元々のサンプルコードです。
>>21 コードを書いていただきありがとうございます。
例題を簡略化したせいで反ってわかりにくくなってしまい、すみませんでした。
とりあえず継続というものを調べつつもう少し考えて見ます。
皆様ありがとうございました。
考えてみたけどこれじゃだめ? (* 1/2 *) type state = { cash: int; deposit: int; action: unit -> state } let rec work_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "work"; let cash' = succ cash in if cash' < 3 then work_state cash' deposit else rich_state cash' deposit )} and rich_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "go to the bank"; let deposit' = succ deposit in if deposit' < 5 then work_state 0 deposit' else neet_state 0 deposit' )}
(* 2/2 *) and neet_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "sleep"; let deposit' = pred deposit in if deposit' > 0 then neet_state cash deposit' else work_state cash deposit' )} let initial_state = work_state 0 0
この規模だといいけど、 行動の結果と選択を独立に実装できる方が 将来の拡張にはよいんじゃないかな、 特に質問者はゲームAIの本読んでるらしいし。
いつのまにやらObjective Caml is 3.11.1でてる
OCamlで副作用のあるライブラリを使っていて、 クロージャの(環境の)合成がしたくなったのですが失敗します 再現コードを書くと ma,mbは期待通りですがmcは毎回1が出力されます 環境の中の環境ってのは呼ばれるごとに新しい環境になるからってことですかね let a x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=!r+1;; let b x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=2* !r;; let c x f = fun ()->(a x (b x f))();; let ma = a 0 (fun ()->Printf.printf "a\n" );; let mb = b 1 (fun ()->Printf.printf "b\n");; let mc = c 1 (fun ()->Printf.printf "c\n");; ma();;ma();;ma();; mb();;mb();;mb();; mc();;mc();;mc();; てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな by poor man
let rec length list = match list with [] -> 0 | x::rest -> 1 + length rest;; このリストの長さを返す再帰関数の動きなんですが、下へ展開していって ループが終了したら、上に値が戻ってくるイメージでOKですか? length [2; 1; 3] = match [2; 1; 3] with | 2 :: [1; 3] -> 1 + length [1; 3] = match [1; 3] with | 1 :: [3] -> 1 + length [3] = match [3] with | 3 :: [] -> 1 + length [] = match [] with [] -> 0 1 + 0 1 + 1 1 + 2 length [2; 1; 3] = 3
上とか下でなくて、行って戻ってくるイメージですね。ブーメランみたいな。
インデントを浅くしろw 基本的に再帰は漸化式と同じと考えれば良い。 それで合ってるが、一々動作を深く考えずに関数を定義出来るようになるのが 最初の一歩だから精進すべし。
ども。インデントはあれかなぁと書いた後に思いました。 命令型言語だとカウントする変数を作ってa = a + 1みたいな イメージが強くて直感的にこのソース見て理解出来なかったので。 書いて見ると理解出来るもんですね。精進します。
>>29 ocamlのトップレベルには#traceというディレクティブがあって、
指定した関数の動きが表示される
再帰関数の動きを確認するのにはやや便利だから使ってみて
# #trace length;;
length is now traced.
# length [1;2;3];;
length <-- [<poly>; <poly>; <poly>]
length <-- [<poly>; <poly>]
length <-- [<poly>]
length <-- []
length --> 0
length --> 1
length --> 2
length --> 3
- : int = 3
>>34 こういうのあったんですね。助かります。どもです。
>>28 質問をまず推敲してくれ。「期待」とやらが何かわかんねー。
> てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな
それは違うだろ。
>>28 let c x f = a x (b x f);;
これが28の期待に沿っているといいのだが。
釣りなの?釣りなの? > HLVMってのはLLVMの関数型特化版、みたいなイメージ? そういう理解でいい。 HLVM そのものの批判は詳細を知らないのでできないけど、 - Caml team は HLVM プロジェクトには全く噛んでない。 - Caml team と consortium が関知しない code generation の総入れ替えはありえない。 - HLVM で騒いでいる奴は各種言語メーリングリストの有名粘着。何かというとすぐ自分の有料メールマガジンに誘導。 - なんかちょっとした toy example が出来るたびに大騒ぎ。正直みんな食傷している。 将来化ける事もあるかもしれない。が、今は放置をお薦め。時間の無駄。
>>41 前スレでも話題になってたHarropのこと?
http://www.infoq.com/jp/news/2008/03/revoerability-and-testing-oo-fp ここに
「Feathers氏に反対する人の多くは、関数型のコード乱雑になる原因は、
関数型ではないイディオムを関数型言語に持ち込んだこと以外にはないと
信じている。」
っていう記述があるけど、関数型言語のイディオム(とかデザインパターン)って
どんなのがあるの?おしえてエロいひとー
>>43 原文を読んでみると、単に副作用のない純粋関数型のコードを
関数型のイディオムと呼んでいるように思えるな。
>>43 そうだとするとあまりに漠然としていて多少の窮屈感が欲しくなるな。
ノーパンでスカートを穿いているような、あるいは力戦になって次に
なにを指せばいいのかわからない、そんな感じ。
そのうちそういうのがまとめられればいいなぁ。
>>45 おっしゃる事があまりに漠然としていて多少の具体感が欲しくなるな。
ノーパンでスカートも穿いてないような、あるいは序盤なのに次に
なにを指せばいいのかわかってない、そんな感じ。
そのうちそういうのをまとめられるようになってくれ。
>>45 関数型が嫌いor慣れてない人の多くは純粋関数型の副作用の無い世界を
非常に窮屈だと感じるわけで。不感症になったのも慣れということだなw
>>41 ありがとん参考になった!
ベンチマークだけみて速いなーとか思っただけなんで、
そんな背景があったとはまったく知らんかったyo
>>50 GC なしで早いよーと叫ばれてもね。
普通にMLのプログラムがコンパイル出来るようになったら
ベンチを見てみてもいい。
>>43 デザインパターンってぶっちゃけてみれば、バッドノウハウのことでしょ。
関数型言語にそんなのないよ。
昨晩の議論の結果、「デザインパターン」はありませんが、「あるあるネタ集」ならあることになりました。
>>52 関数型言語にデザインパターンがないということはないだろう。要は「あるあるネタ集」(の粒度がある程度あるもの)のことなんだから。
オブジェクト指向でのデザインパターンは関数型言語ではバッドノウハウになり得るというのは同意。
あらゆる意味でF#>>>>Javaだろ。Windows上では。 特に関数型言語が好きだからとかではなく。客観的事実。
Javaはネイティブで動かないからうんこ。 スレッドで動いてるガベコレも時々挙動がおかしくなるからうんこ。
最終話「structをfunctorに」 すべてを終わらせる時…! C・Y・C第1巻は、発売未定です。夢野カケラ OCaml : チクショオオオオ!くらえC++!ガベージコレクション! C++ : さあ来いOCaml!実はオレは一回不正なメモリ操作しただけで死ぬぞオオ! (ガッ) C++ : グアアアア!こ、この地上でもっともバカな言語と呼ばれる四天王のC++が… こんな不純粋関数言語に…バ…バカなアアアアアア (ドドドドド) C++ : グアアアア Delphi : C++がやられたようだな… VB : フフフ…奴は四天王の中でも最弱… C# : MLごときに負けるとは手続き型言語の面汚しよ… OCaml : くらええええ! (ズサ) 3言語 : グアアアアアアア OCaml : やった…ついに四天王を倒したぞ…これでJavaのいるWindowsのWindowが開かれる!! Java : よく来たなObjective Caml…待っていたぞ… (ギイイイイイイ) OCaml : こ…ここがWindowsだったのか…!感じる…Javaの魔力を… Java : OCamlよ…戦う前に一つ言っておくことがある。お前は私を倒すのに 『オブジェクト指向』が必要だと思っているようだが…別になくても倒せる OCaml : な 何だって!? Java : そしてお前の入門書は増えてきたので最寄りの本屋へお取り寄せしておいた。 あとは私を倒すだけだなクックック… (ゴゴゴゴ) OCaml : フ…上等だ…オレも一つ言っておくことがある。このオレに生き別れたF#が いるような気がしていたが別にそんなことはなかったぜ! Java : そうか OCaml : ウオオオいくぞオオオ! Java : さあ来いOCaml! OCamlのnative codeが世界を救うと信じて…! ご愛読ありがとうございました!
> OCaml : こ…ここがWindowsだったのか…!感じる…Javaの魔力を… ワロタ
>>62 F#スレにこんなのあったよ
553 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/01(月) 22:32:37
>>552 OCamlのみ
多相ヴァリアント、ファンクタ、注釈ありで型がつく箇所では省略しても必ず型推論できる性質
Camlp4/5、ビルド関係のツール(F#はしょぼい)
オブジェクト指向部分は根本的に違う(nominal/structural)
>>63 ありがとう。なんか半分以上わからないけど。わかった事にしとく。
>>60 ワロタw
WindowsのWindowにやられたww
>>50 caml-list で Harrop が
New HLVM examples!
というサブジェクトで騒いでるから、それ見て、判断して。
>>63 ここで聞くのもアレだけど
型推論が残念なことになったのは演算子のオーバーロードのせい?
>Java : そうか そうかってwww どんだけスルー
List.fold_left (fun (x,_) y -> x + y) 0 [(1,1)];; を通そうとしたところ This expression has type int but is here used with type int * 'a といわれてしまいます。うまい方法はないのでしょうか?
>>69 高階関数の引数が順番逆なだけじゃね
フォールドライトならそれでおkかも
すいません スレよごしてしまって .... おっしゃる通りでした .... orz
fold 辺りまで来たら、フィーリングでデバッグするんじゃなくて、 ちゃんと型を確認しだしたほうがいいね。
http://itpro.nikkeibp.co.jp/article/COLUMN/20061212/256657/?ST=develop ↑ここを読んでいて、LablGLをインストールしようとして失敗しました。
どうしたらいいか教えてください。
OSはWindowsXPです。
・lablgl-1.04-win32.zipをObjective Caml以下のディレクトリに直接展開しました。
・Microsoft Visual C++ 2008 Redistributable Package (x86).をインストールしました。
・glut-3.7.6-bin.zipをダウンロードし、glut32.dllをsystem32フォルダにコピーしました。
・コマンドプロンプトを開き、
C:\Program Files\Objective Caml\lib\lablGLまで移動し、
ocaml build.mlをコマンドプロンプトから実行しました。
途中までは走っていたのですが、以下のようにエラーが出ました。
C:/Tcl/lib tk84.lib tcl84.lib gdi32.lib user32.lib " togl.cmo
ocamlc.opt -w s -I +labltk -a -o lablglut.cma -cclib -llablglut -dllib -llablglu
t -cclib "glut32.lib " glut.cmo
ocamlopt.opt -w s -I +labltk -c raw.ml
'ml' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
File "raw.ml", line 1, characters 0-1:
Error: Assembler error, input left in file C:\DOCUME~1\****<※ユーザ名>\LOCALS~1\Temp\camla
smd25ac5.asm
Native build failed: error 2
You can still use the bytecode version
Now ready to use on an OCaml MSVC port
※ここまで
またコマンドプロンプトから > lablglut を実行した際にもエラーが出ました。
Cannot load required shared library dlllablgl.
Reason: C:\Program Files\Objective Caml\lib\stublibs\dlllablgl.dll: このアプリケ
ーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケ
ーションを再度インストールすることにより問題が解決する場合があります。
※ここまで
原因はわからんが、参考までに labltkはインストールしてるか ocamlはネイティブコンパイラまでインストール済か Activetclはバージョン8.5系だと動かなかったので8.4を入れる build.mlを実行した際に cygwinのlink.exeが使われるとエラーになるので 環境変数からcygwinのパスをはずす glutはそれと同じバージョンで動いたよ
>>74 レスありがとうございます。
ですがどうも上手く行かないので、悩んでいます。
どこかで薦められてOCamlは
"Self installer (3.11.0) for the port based on the MinGW toolchain"
が入ってますが、Cygwin入れてないんです。これが原因なのかなぁ。
Cygwin以前入れたのですが今は外してしまってます。
近いうちに再度Cygwinをインストールしてみることにします。
読み進めたいので、このまま
>>73 の第五回は一応読むだけ読んで、
次に行きたいと思います。
ocaml用のサウンドライブラリ(スピーカーから音を出したりマイクの音を拾ったり)で一番ポピュラーなのって何かな?
>>76 OCamlSDL でサポートしてなかったら自作して公開よろ。
>>77 だって、作るとしたらWin32APIとかOSSとかALSAとかいろいろサポートして、なおかつメンテもしないといけないんでしょう?
嫌ですよ。
>>78 うわなんかヘタレられた。
自分のやりたいAPIのインターフェースだけ作りゃいいじゃん。
メンテもしたけりゃするだけでいいじゃん。
初期化とかは何かのライブラリ関数呼ぶだけだし。
やりたいことはほとんどデバイスから
ノンブロッキングに読んだり書いたりするだけで大抵出来るっしょ。
>>79 そんな俺しか使わないライブラリを公開するぐらいなら、公開せずに手元に持っておいて、作り溜めしときますよ。
>>75 俺もなんかそうなる。
OCamlは3.10.2でLablGLは1.03にもどしたら上手くいった
>>81 ありがとうございます。1.03にしたら "OCaml build.ml"は上手く行ったようです。
しかし
「ocamlrun.exe - コンポーネントが見つかりません
ocamlrun.dll が見つからなかったため、このアプリケーションを開始できませんでした。」
となってしまいまたもや失敗。
>>73 のリンク先を見るとLablGLのインストールが失敗してるというのですが
インストールしなおしても同じエラーメッセージが出ます。はてさて。
OCaml本体は"ocaml-3.11.0-win-msvc.exe"をインストールしなおしました。
Windowsだとライブラリのビルドでつまづくことが多いよね。 OcamlSDL関連のビルドで上手くいなかくてビルドを諦めた。 OCaml自体はプログラミング入門者にも比較的優しいと 思うけど環境は若干敷居が高めだと思う。 んでWindows使うのが悪いとかいわれちゃうとしょんぼりする。 そもそもLinux系を使うこと自体、本職でない人にとっては 普通ではないわけで。
あれぇ?書き込めた。どうせアク禁の巻き添えで書き込めないだろうと
勉強不足を棚に上げた愚痴
>>83 を書いてみたら・・・。
ごめんなさい。反省しています。
OCamlユーザは計算機科学の研究者が多いんだから、それは仕方ないだろ
教育用というか初心者向けのサイトですらUNIX前提の記述が多いように思えるけどな。
UnixやLinuxがプログラミング教育に適しているからだろう。
>>85 >>86 うん。わかってはいるんだ。あんな書き込みをしてしまってごめんとしかいいようがない。
まあ、ドザーはおとなしくF#でも弄ってなさいって事だw
>>82 (いまさらだが)OCamlのReadmeを見ると MinGWの場合は
Do *not* install the Mingw/MSYS development tools from www.mingw.org:
these are not compatible with this Caml port (@responsefile not
recognized on the command line).
って書いてあるからCygwinが必要なんだと思われる。
英語は雰囲気で読んでいるので間違っていたら誰かやさしく叱ってくれ。
>>84 > あれぇ?書き込めた。どうせアク禁の巻き添えで書き込めないだろうと
> 勉強不足を棚に上げた愚痴
>>83 を書いてみたら・・・。
この精神でビルドがんばれ。
どうせビルドできないと思ってもできるかも。
いやcygwin/mingw系はさっさとあきらめるのが吉だと思う
>>89 そんなこと言ってるから関数型はいつまでたってもドマイナーなんだよ
スレとは関係ないが、東北型言語を使用する俺は「だっけ?」が方言かどうかわからなくなるときがある。
東北型言語と聞いたら、語尾に#を付けるんだと思った。
そういうもんなんだとあきらめる事にしましたw 結局Cygwinなんか入れるよりもお勉強用のLinuxマシンを用意した方が早そうですね。 レス頂いてありがとうございます。
>>99 完全にスレチだが、別にマシンを用意しなくても仮想環境を使えば楽なのに。
セレロン1G、メモリ256Mしかないノートなんです。仮想環境は無理では。 Knopixとかならできるのかな?
>>101 virtual boxでdebianがおすすめです。
かなり低スペックでも動いて、何よりaptーgetでocamlも含め、たいていのライブラリが簡単にインストール出来ます。
プログラミングinOCamlの練習問題5.6 @を使わずにquick_sortを書き換えよ ヒント:引数を一つ増やして整列済みのリストを受け取る ってやつが解けまへん。。 教えて、偉い人
>>102 まじっすかー!ありがとうございます。
今Ubuntuのデュアルブート環境作成厨…orz
ウブンツ重かったらそちらを試してみます。
>>103 本読んでないけど末尾再帰じゃないすかね。
>>104 apt getはububtuもdebianもほぼ同じなので、ububtuでも大丈夫ですよ。
virtual box + debian + OCamlで作成したネイティブコードはやっぱり Windows上では動かないん?会社がWindowsだから・・・。 動くなら今すぐそっちの環境に移行したい。
>>107 当然動く訳無い。
大体Linux上で生成されるオブジェクトファイルはELFフォーマットだし。
OCamlってLLVMのコード吐けるんじゃなかったっけ
LLVMのocamlバインディングはある。という話と取り違えたのかな。
>>110 終わったところすまないが、
>>109 は吐ける!と断定しているわけではないから
もう少し生暖かくてもいいと思うんだ。
>>112 >>110 はいい加減なこと言う奴にうんざりしてるんだろうな。
この板はそんな奴ばかりだから、せめてソースくらい示さないと。
LLVMのコード吐けるようにしようぜ、という話だけなら有った気がするが
>>114 しーっ!そういうこと言うと
憶測で(ry
とか言われちゃう
>>103 「書き換えよ」とか「引数を一つ増やして」といわれても元々のコードがないと
答えられないぜよ。
偉い人は プログラミング in OCaml を買ってないので答えられないのではないか。
>>117 そういえばOcaml-nagoyaの連中(有限会社ITプランニング)ってどうなったの?
なんか公式サイトにつながらないんだけど。
OCamlは大文字で始まるidはconstructor扱いになるんだな SMLのコードを移植していてはまった
ocaml触ってみたんだけど、やっぱりライブラリが少ないね。 練習でちょっとしたものを作ろうとしたけど、ライブラリの少なさでたちまち不便で止まってしまった。
そんなに副作用たっぷりのコードを書きたいならF#でも使えばいいのに
>>122 HaskellならMonad IOがスタンダードだが、OCamlにはないからね。
IOはどうしても副作用になってしまう。
>>118 憶測(ry
じゃなくて、本が違う。
ITplan は知らんけど、一日ぐらいサイトが落ちてていいだろ。週末だし。
>>126 どうでも良いけど、365日接続できないサイト運営してる時点で技術力を疑う。
休日にメンテなら仕方ないけど、平日の夕方に落ちてるのは問題だな。
>>118 ,126,127,128
恐縮です。うちが契約してるデータセンター屋さんの電源障害だそうで、何ともならなくて。
そろそろ復活するらしいのですが、うーん。
>>120 The Caml Hump(
http://caml.inria.fr//cgi-bin/hump.en.cgi )という
ところがあって、ここでライブラリを探すとかなり見付かりますよ。
CGI、DB接続、GUI、UTF-8、アルゴリズム色々など有ます。
質問です。match文に関する質問です。
これは文法の慣習みたいなものかなと思うんですがどうなのかなぁと。
リストを受け取って何かを返す関数の場合、リストの要素が組やレコードだと
match文の中にmatch文を書くことがありますが、match文ではなく直接パターンマッチさせる書き方の方が
良いのでしょうか?
>>83 vmwareを使ってxp上でubuntuを動かして、ocaml勉強してます。
>>131 質問をするときはサンプルコードを示したほうが回答してもらいやすいよ。
この文章だと
>match文ではなく直接パターンマッチさせる書き方の方が良いのでしょうか?
あたりがわかりづらいと思われ。
>>132 kekkonっていう関数で、anataというレコードが要素のリストを引数にして
条件に合う人数を返すとかいう場合に・・・
let rec kekkon anata = match anata with
[] -> 0
| first :: rest -> (match first with
{name = n; toshi = t; syunyu = s; tyotiku = t; sisan = s; youshi = y}
-> 0
とかと書かずに、以下のように書くほうがいいのかなぁという質問です。
let rec kekkon anata = match anata with
[] -> 0
| {name = n; toshi = t; syunyu = s; tyotiku = t; sisan = s; youshi = y} :: rest ->
>>133 お好きな方を。ただ、
let rec kekkon anata = match anata with
は
let rec kekkon = function
の方が簡潔。
>>133 このサンプルコードのようにレコードであれば直接アクセスするっていう手も
あるよ。タプルの場合は状況にもよるけど2番目の方法が多いんじゃないかな。
record label に折角意味のある名前を付けてあるのに、 pattern match でワザワザ意味不明な変数に束縛するスタイルはおかしい。 そんなことするから s が二回束縛されてるヨ。 136 の言うように r.name とかでアクセスするほうが普通。
データ構造について調べていたら
http://en.wikipedia.org/wiki/VList のVlistというものを見つけたのですが、これはリストを使った
動的配列のようなものでしょうか。(英語が苦手のためよくわかりませんでした)
また、OCamlで書くとどのようになるのでしょうか。
分かる方がいたら教えてください。
まぁ、List.nth が妙に早い list と思えばいいね。 答えが欲しいの?それとも一緒に考えてほしいの? Okasaki には載ってないね。
長さが倍になっていくarrayが中身のリンクリストにしか見えないんですけど。 英語が読めなくても図は見えますよね。 構造はこんな感じでいいんじゃないの(図のまんま)。 type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a array type 'a vlist = 'a vlisti * int 操作は自分で考えませう。
>>140 ありがとうございます。コードのおかげでなんとなくですが
イメージできました。(とはいってもこのデータ構造が
どんな風にありがたいのかは、まだ理解できてはいないのですが・・・)
教育上は type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a option array のほうが良いです。 140 だと埋まって無いトコを埋める値が必要ですね。(Obj.magic 0 などで埋めるのはダメ絶対。)
ctags5.8でOCamlがサポートされたらしいよ。
ctags -> Exuberant Ctagsに訂正。
otagsがいらなくなると嬉しいな 微妙にctagsとオプションが違ったりするのがウザかったんだ
OCamlからCへのトランスレーターってありませんか?
OCamlで (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun> int -> int = <fun> で型だけを指定して変数を宣言することはできますか?
変数何それ怖い というか何がやりたいのか全くわからん
ただ、上は-rectypesなしで出来るかはわからん
型注釈を使った無名関数をかいていて、ふと閃いて fun (x:('a->'b)->(z:'a->'b)) z -> z;;としたところ - : (('a -> 'b) -> z:'a -> 'b) -> 'c -> 'c = <fun> のように受理されましたが、3つのうちの最初、z:'aのz はどういう意味があるのか わかりません。 fun (x:('a->'b)->(z:'a->'b)) -> z;; としてもzは拘束されていないようですし。
それはxという識別子をxはintである、ということだけ指定して 宣言できるということですよね?やりかたを教えていただけますか?
>>148 は
>>149 >>150 様あてです。失礼しました。それと回答ありがとうございます。
変数が宣言できるとは言ってない
ただ、関数の引数などにアノテーションすることで
関数の定義範囲を狭めることは出来る
普通の定義
let f x = x;;
型全体
let f x : int = x;;
let f x : int ->int = x;;
引数
let f (x:int) = x;;
let f (x:int->int) = x;;
>>148 の上の型は、これを使って
Yコンビネータの型をint->intで制限したもの
質問者はもう少し動機などを書き加えてほしい。推敲した上で。
背景説明無しに、間違った用語で質問されても答えられません。
逆に説明があれば、多少間違っていても回答者の方で正しく解釈できます。
148 だけだとホントに意味不明だが 153 からすると、C における int x;
の様に「変数を宣言」できるか、というのが質問の意図だと思いますが、
ML では値の無い「識別子の束縛」は出来ません。
154、お前は未来に向けて話しているのか。
>>152 z:'a の z は識別子ではなくラベルです。後の z とは関係ありません。
文法をちゃんと確認して、ラベル付き引数の解説を読んでください。
>>159 ありがとうございます。Yコンビネータのようなものを作ろうとしていました。
非常に参考になりました。
>>154 が回答に感謝しているのは
>>150 の、出来る、が回答になっていると思ったからなのですが。
(('a -> 'b) -> 'a -> 'b) -> 'a -> 'bという型の識別子を定義できる と Yコンビネータを定義できる は100光年くらい離れてる気がする
(///)のような演算子をつくってhaskellのようなリスとりてらるを部分的に実現したいです。 (3///5) == [3;4;5] みたいな感じ。 演算記号は何が適当ですか?
>>163 List.iter print_int (1--100)
とかですか? いいですね。見やすいです。
SML/NJから移ってきましたが、SMLとは色々と違う部分が多くて戸惑います。 OCamlの標準ライブラリに無いものは自分で実装しているのですが、SMLとの コンパチを取るライブラリなどがあったりするのでしょうか?
再度すいません。SML/NJにはCompilation Managerというものがあってmake相当 のことが出来るのですが、OCamlではUnixのmakeを使うのが普通なのでしょうか? OCamlのドキュメントではmakeを使った例が書いてありました。 それとも、omakeというものがあるようですが、これを使うのが今時のやり方で しょうか。
SMLとのコンパチを取るライブラリなんていう後向きの物は聞いたことありません。 OCaml の stdlib は「標準ライブラリ」にあらず、 OCaml 自身をコンパイル するために最低限必要な関数を集めただけと考えたほうが幸せです。 「次世代」標準ライブラリ候補として Extlib, OCaml Batteries Included, Jane Street Core などありますからそれのウチ好きなのを使ってください。(Batteries は Extlib を内包しているはず) ビルドは make か OCaml 付属の ocamlbuild か omake か、別に何でも良いんじゃない? - GNU make : どこにでもある。他でも使える。枯れてる。 - ocamlbuild : OCaml に付属。全く使えない。 - omake : 超強力、普通インストールされていない。強力過ぎて一線を超えた使いかたが難しい。
>>169 ありがとうございます。
ExtLib, Batteriesの双方に同じ名前のモジュールが含まれていたので疑問に思って
いたのですが謎が解けました。SML Basis Libraryにあるような関数は、名前違いで
大体ExtLibでサポートされているようで安心しました。
ビルドツールはGNU makeを主に使ってきたのですが、omakeはファイル更新の
チェックが素晴らしいようなので、omakeを使ってみます。
なんでもいいから早く標準に入れてくれ 追加インストールとか面倒だし
いったよー おもろかったけどgolfとかコンパイラ改造とかネタが裏街道過ぎて 実用志向のユーザー増えねえだろこれじゃ、とか思った
行かなかったが、ストリーミングでアメリカ人?の発表のところまで見た。 Golfの話は意外と参考になった。演算子定義周りとか、普段あまり使わないから。 演算子によって優先順位が固定されているの勉強になった。 あとObj.magic。あれは反則技だろw
OCamlが+-*/等の演算子をpolymorphicに出来ない理由って何?
jocamlをmingw上でコンパイルするにはどうすれば良いでしょうか。
jocamlをmingw上でコンパイルしようとするとこんなエラーが出ます。 $ ./configure $ make world ・・・ gcc -o ocamlrun \ prims.o libcamlrun.a -lm libcamlrun.a(main.o):main.c:(.text+0x26): undefined reference to `caml_expand_command_line' libcamlrun.a(sys.o):sys.c:(.text+0x4ea): undefined reference to `caml_win32_random_seed' libcamlrun.a(startup.o):startup.c:(.text+0x936): undefined reference to `caml_signal_thread' libcamlrun.a(signals_byt.o):signals_byt.c:(.text+0x46): undefined reference to `caml_win32_signal' libcamlrun.a(signals_byt.o):signals_byt.c:(.text+0xab): undefined reference to `caml_win32_signal' collect2: ld returned 1 exit status ・・・
多分 configure したのが間違い。 OCaml の mingw のビルドを参考にしたら? JoCaml には付いて無いけど OCaml の README.win32 に書いてある。
>>179 ありがとうございます。
cp config/m-nt.h config/m.h
cp config/s-nt.h config/s.h
cp config/Makefile.msvc config/Makefile
config/Makefileの中身のOTHERLIBRARIESからlabltkを削除し、PREFIXをインストールしたいディレクトリに変更し、
make -f Makefile.nt world
を実行したまでは良かったのですが、
make[1]: *** No rule to make target `win32.c', needed by `win32.o'. Stop.
make[1]: Leaving directory `/d/tmp/jocaml-3.11.1/byterun'
make: *** [coldstart] Error 2
と出てストップしてしまいます。
jocaml-3.11.1にはwin32.cが入っていないようですが、これは不具合ということでよろしいでしょうか。
mingwなんだからMakefile.mingw使わなきゃならないと
さーねぇ、俺は JoCaml 使ったこと無いからこれ以上は判らんね。 同じバージョンの OCaml から引っ張って来たら運が良かったらビルドできるかも知れないが、 こんなトコで聞くくらいだったら JoCaml の人に win32.c 無いって聞く方がいいんじゃない?
>>181 ん?あ、確かに。リンクエラーも判らんし README も読めんのに挑戦かよ。
OCamlから足りないソース持ってこないといかんかもね それで動く保証はないけど
>>181 あ、Makefile.mingwでやりました。
上のはコピペで修正し忘れていました。
>>185 JoCamlでアプリを書くつもりなので、Windowsでないとダメなんですよ。
Luc でさえ、windows で試してないって言ってるし、 イバラの道じゃないかねー。Luc に聞かんと誰もわからんよ。 ちなみに win32.c は jocaml のレポから随分前に消えてる。
http://jocaml.inria.fr/ に
We distribute JoCaml as sources. Those sources are for Unix systems
と書いてあるが、これは読んだのか?
Batteries Included のドキュメントみてたら リスト内包標記とか where 節とか open Module in とかあってびびった 使ってる人いる?
既存のp4拡張をいろいろ集めただけでしょ。 open in はオーバーヘッドを理解してれば使える。
open M in e は let module M' = struct open M let v = e end in v に変換されるので、ブロックを一つ作る。 普通はたいしたこと無いが、再帰関数中で open M in するのは少し考え物だ。
すまん、let module M' = struct open M let v = e end in M'v の間違い let rec f x = open M in e (* e 中に f の再帰呼出あり *) とか書くと f の呼出しごとにブロックが出来て、時間とメモリを食う。
実行時にもオーバーヘッドがある。気になるならベンチ取ってね。
浅井さんの「プログラミングの基礎」のサポートページって消えてる?
birdの書いたsudokuの解放プログラム面白かった。
http://www.cs.tufts.edu/ ~nr/comp150fp/archive/richard-bird/sudoku.pdf
Practical OCaml 買おうかと思ったのですが、評判悪いのが気になりました。 実際に読んだ方いましたら、感想を聞かせてください。
> Practical OCaml 買おうかと思ったのですが、評判悪いのが気になりました。 > 実際に読んだ方いましたら、感想を聞かせてください。 たった今、ゴミだからいらないという人にもらいました。確かにゴミです。ネタとしてならどうぞ。
俺はocamllex ocamlyacc の簡単なチュートリアルが欲しくて買ったけど、 そこについては別にひどくは無かったと思ったよ。
コードのインデントが至るところで狂っている時点でダメでしょう。 どのページを開いても何かツッコミどころがあるというある意味貴重な本。 値段も安くはないし絶対にお薦めしない。
SML#の大堀先生は、最近、何してるの? 継続してれば、有望だと思ったんだけどな・・・ > SML#
>>201 apressの書籍ってほとんどハズレだと思う
これもハズレだったよ
推測の為の方程式として,土礼君の方程式がよく知られている. しかし,パラメータの値には様々な見解がある. N = R_s * f_p * n_e * f_l * f_i * f_c * L N:道路に落ちている軍手の数 R_s:軍手の年間生産量 f_p:軍手を使用する作業の割合 n_e:軍手を屋外で使用する割合 f_l:軍手が使用される作業の割合 f_i:軍手を着脱する回数 f_c:軍手の移動距離 L:道路上の軍手の寿命
靴とか靴下が落ちているワケも気になるぞ 誰か研究してくれ
>>212 ほらよ。
N = R_s * f_p * n_e * f_l * f_i * f_c * L
N:道路に落ちているパンティーの数
R_s:パンティーの年間生産量
f_p:パンティーを使用する作業の割合
n_e:パンティーを屋外で使用する割合
f_l:パンティーが使用される作業の割合
f_i:パンティーを着脱する回数
f_c:パンティーの移動距離
L:道路上のパンティーの寿命
パンツのことをパンティと呼ぶのは40代以上。 40代未満はパンツかショーツと呼ぶ。
最近は単語で会話するのが流行っているの? 例: 「お茶」→「俺は紅茶が飲みたい。お茶といえば緑茶じゃなくて紅茶でしょ。緑茶とかジジくさいし。」
>>214 類似定理に「キャロライン洋子を知っている人は1969年以前生まれ」がある。
ならばこれはどうだ N = R_s * f_p * n_e * f_l * f_i * f_c * L N:道路に落ちているブラジャーの数 R_s:ブラジャーの年間生産量 f_p:ブラジャーを使用する作業の割合 n_e:ブラジャーを屋外で使用する割合 f_l:ブラジャーが使用される作業の割合 f_i:ブラジャーを着脱する回数 f_c:ブラジャーの移動距離 L:道路上のブラジャーの寿命
>>217 72年生まれでびっくり日本新記録を見ていた私はなんですか?
びっくり日本新記録は1975年から1985年までやっていたようだから、 72年生まれなら13歳中一まで見れていたことになる。 特別なことはなにもないと思うが。 マッハGoGoGoとか鉄腕アトムの第一作目をリアルタイムに見ていたとかいうなら驚愕ものだが。
5年前の俺なら老害呼ばわりしたかもしれないが、 最近はむしろ尊敬するようになってきた。 なんつーか、歳を重ねるってのはそれだけで立派だよ。 対して俺はゆとりに「この昭和生まれが」と言われてショックを受けた
>>223 そうは思わない
> 最近はむしろ尊敬するようになってきた。
ああ・・・ついにお前も老害の仲間入りか。
人間というのは自分の置かれた環境や立場によって考え方を変える生き物だというだけのこと。
お前が老害ジジイを擁護するようになったということは、
老害扱いされる時期がもうすぐ目の前に来ている証拠なんだよ。
たしか60歳以上の老人たちは日本が持っているカネの55%を持っているんだよな。
そしてそのカネを何に使うかというアンケートによると、
がんばってきた自分へのご褒美に贅沢するために使うのだそうだ。
若者が苦しんでいるときにそんなことを許していいわけがないだろ。
老人を過剰に保護するのをやめても老人は困らないし、
財源確保のために老人たちから搾り取ればいいと思う。
あと、就業における年齢制限もやめるべきだと思う。 定年を設けている企業や官公庁が大半だと思うけど、それって年齢差別だよね。 60歳でもまだまだ働ける人がほとんどなのに定年で辞めさせるのはどうかと思う。 そうする代わりに、経営者に自由に解雇する権利を与えて、年功上列・終身雇用も撤廃して、 終身雇用に安住している無能なやつ(老害)をどんどん解雇していけばいいと思う。 無能な奴は一生平社員の単純労働でこき使えばいいよ。 長い間単純労働してるからといって才能の無い奴を無理に昇進させる必要もないと思う。
>>223 歳を重ねるだけで得られるようなものなら誰でも手に入るから価値は無い。
俺も高齢者は手厚く保護されすぎているように思う。 もっと若者と同じように扱えばいいのにね。 具体的にどこか体が故障している人を障害者認定して、 障害者として文化的な生活をおくるために補助をするなら分かるけど、 高齢者だからという理由だけで保護するのは過保護というものじゃないかな。
ジジババとかマジいらねえ 団塊世代は頭が鈍くて経験も役に立たないし物事を計画的にするのも下手だし散らかすのだけは一流で後片付けのことは微塵も考えないゴミなんだよなぁ
>>225 > がんばってきた自分へのご褒美に贅沢するために使うのだそうだ。
金が回るならいいことじゃないか
>>233 ところが、使った分が戻っていくのが世にも奇妙な現象
>>236 ダメ、ジジババはコンピュータ音痴だから。
団塊世代は経済の成長期に楽しくお仕事して、下向きになったらつまらないから働くのやめるとか言い出す。 おいしいところだけ食べてトンズラとかマジきめえw 自分たちの責任を後世に押し付けて、自分は今まで楽しく稼いだお金で楽しく老後を過ごす予定なのか? そんなことが許されるわけがない。 世の中みんなが辛いと思っているんだから自分だけ良い思いをしようとするなんて許されるわけがない。 団塊世代は身勝手だ。 搾取されるべきは団塊世代だ。 金があるんだから搾取してもかまわないだろ?
一番の癌は大企業にぶらさがってる労組だな 特にJALやJRや某新聞社の労組 それから日教組 こいつらが日本のまじめな生産者の利益を貪ってる
正社員を簡単にクビに出来ないから 会社は正社員じゃなくて派遣を使いたがる 派遣ピンハネ業だけが儲かる
クビにできないのを良いことに労働組合を背景にやりたい放題やって楽して金だけもらって逃げた団塊世代
マルチのコピペにいちいち釣られてんのか コピペした奴が自分で反応してんのか どっちにしてもアホだ
>>245 面倒だから経営も外注するか。
労組嫌ってるやつは公務員か?死ねよ
>>243 欧州のどこだかは、派遣使うとそれだけ割高になるような法律になってるとか
聞いたことある。
>>245 プログラマの派遣なら、正社員の派遣が主流じゃないか?
>>249 法律なんか作らなくても、市場原理に任せておけば派遣のほうが高くなる。
レンタルとリースのどっちが割高かってこと。
むしろ、法律によって市場を歪めているのが諸悪の原因。
OCaml用のlibcurlバインディングらしい、ocurlを入れようとしたのですがエラーが出ます。 curl-helper.c 主に「dereferencing pointer to incomplete type」というエラーが大量に出ます。 どうすればいいのでしょうか。 ./configやlibcurlのインストールなどは済ませています。 環境はMSYS + MinGW、Windows 7です。
バージョンはよいみたい。一度古いので苦労した記憶がある
libcurlはWindows版では最新の7.19.7を入れました。
MinGWは最新のものを入れています。
ところで、
http://jocaml.inria.fr/ や
http://caml.inria.fr/ が落ちているのですが。
http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc135 ここの例通りにCでOcamlのモジュール使おうと試してるんだけどうまくいかない。
最後の手順の cc -o prog main.c mod.a -lcurses で詰まっています。
mod.a(startup.o):startup.c:(.text+0x9e): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x240): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x2e7): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x93b): undefined reference to `__beginthread'
mod.a(sys.o):sys.c:(.text+0x7): undefined reference to `__errno'
mod.a(sys.o):sys.c:(.text+0xf7): undefined reference to `__errno'
mod.a(sys.o):sys.c:(.text+0x101): undefined reference to `__errno'
mod.a(str.o):str.c:(.text+0x30f): undefined reference to `__imp___pctype'
mod.a(str.o):str.c:(.text+0x32c): undefined reference to `__isctype'
こんなエラーが大量に出る。
libcamlrun.aが怪しいと思うのだけれどどうすればいいかわからない。
環境はXPでCygwin Ocamlは3.10.2
Cygwinでocamlc -c modwrap.cすると何故かアクセスが拒否されるので modwrap.cとmod.mlのコンパイルはMinGWでやりました。
>>259 Cランタイムのシンボルを見つけられてない、ということで
>Cygwinでocamlc -c modwrap.cすると何故かアクセスが拒否されるので modwrap.cとmod.mlのコンパイルはMinGWでやりました。
が怪しい。
この部分MinGWとCygwinの互換性はあるの?Cygwin知らんけど、全部-mnocygwinならどうだろう。
>260 >この部分MinGWとCygwinの互換性はあるの? エラーが出てるのは正に MinGW と Cygwin で互換性のなさそうな部分だね。 >259 >何故かアクセスが拒否される modwrap.c を Windows ネイティブのアプリで編集していたりすると発生する場合もあるので ・Cygwin アプリで編集する ・mkpasswd とか使って /etc/passwd を見直してみる ・とりあえず chown / chmod してみる ・ACL 周りの設定を変えてみる(mount とか環境変数 CYGWIN とか) あたりはどうだろ。
>>260 >>261 助言ありがとうございます。
レスを頼りにいろいろ試してみましたが、だめでした。
OcamlもCygwinも使ってまだ日が浅いので大事なところを見落としているのかもしれません。
今忙しいのであまり時間が取れないのですが、Cygwinで揃えてまたいろいろと試してみようと思います。
本当にありがとうございました。
Moscow ML 使ってみようと思ったら、もうずっと更新されてないんだね…
『プログラミングの基礎』 浅井健一著 を買ってポチポチ楽しく
やってるんですが、著者のサポートサイトに書いてあるように
やっても、未だに日本語の表示が出来ません。
http://pllab.is.ocha.ac.jp/~asai/book/Linux.html 環境はWinXPのVMPlayer上のDebian(lenny)でやってます。
端末でインタープリタ走らせてる場合も、Emacs上でtuareg-
modeでやってる場合も文字コードが表示されてしまいます。
助けてけろ〜
分からんけど、なんでLANG=en_USのISOなんとかなんだろ?ja_JP.eucJPとかじゃないのか
signatureのfunctorの使い方がよくわかりません。 signatureを受け取ってstructureを返すfunctor Aと、 signatureを受け取ってsignatureを返すfunctor Bを定義したとします。 signature CにAとBを適用したものをA(C), B(C)としたとき、 A(C)にB(C)を適用したstructureはどうしたら使えますか?
あれ?OCamlのfunctorってsignatureを受け取ったり返したり出来るの? 受け取るのも返すのstructureだけだと思ってた
質問していいですか。 'a * 'bの値を受け取り、型'aと'bが等しいか否かを判定する関数はo'camlで書けますか?
>>282 何がしたいのか分からないけど
OCamlでは型情報は実行時には残っていないので
そういう型を扱うプログラムは一切かけないとおもう
OCamlってなんで最上位ビットをゴミ集め様に使っちゃうようにしたのかな。 なんか、これが凄くアダになってるように思えるのだが
$ sudo aptitude install ocaml … 以下の新規パッケージがインストールされます: camlp4{a} ledit{a} libdrm2{a} libgl1-mesa-glx{a} libpthread-stubs0{a} libpthread-stubs0-dev{a} libx11-dev{a} libxau-dev{a} libxaw7{a} libxcb-xlib0-dev{a} libxcb1-dev{a} libxdmcp-dev{a} libxext-dev{a} libxi-dev{a} libxmu6{a} libxpm4{a} libxtst6{a} libxv1{a} libxxf86dga1{a} libxxf86vm1{a} ocaml ocaml-base{a} ocaml-base-nox{a} ocaml-interp{a} ocaml-nox{a} tcl8.4{a} tk8.4{a} x11-utils{a} x11proto-core-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a} x11proto-xext-dev{a} xbitmaps{a} xterm{a} xtrans-dev{a} 0 個のパッケージを更新、 35 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。 29.4MB のアーカイブを取得する必要があります。 展開後に 97.0MB のディスク領域が新たに消費されます。 (#^ω^)ピキピキ
音沙汰なくてちょっと諦めかけてたから新バージョンリリースめでたい
OCamlの型で 'a. 'a list というのを見たんですけど、この「.」って何ですか?
「.」が何かと言われるとむずいな 「'a.」は「任意の型パラメータを'aとし、その'aついて...(for all)」の意味 例えば、 type 'a t = { e : 'a } は'aを型パラメータに取るけど、 type 'a t = { e : 'a; p : 'b. 'b list } とすると、任意の型'bをパラメータに持つ型をレコードの要素にできる もちろん type 'a t = { a : 'a; p : 'b list } は'bがunboundだからエラー
SMLにはレコード更新の機能がなく、日常的に苦労しているので、ネイティブコードが はけるSML#のリリースは待ち遠しかった。 ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。
>SMLにはレコード更新の機能がなく、日常的に苦労している すげえ、日常的にか。仕事に使ってるの? >ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。 レコード拡張って?
MLton って無限ストリーム使ったプログラムも最適化してくれるの?
>>297 小規模な数値計算をしているだけで、すごいことはしていません。
Fortranで十分ですが、いくつかの部品を定義して、NJの対話環境
で評価することで、試行錯誤できて重宝してます。
レコードの拡張
連結と言うべきだった。
{a=1,b=2}#{c=3}
val it={a=1,b=2,c=3}
ができると嬉しい。
Vimのインデントファイルで ocaml.vimやomlet.vimより いいものありませんか?
MLで書くときはスタイルに悩むね。 inの前で改行すべきか? 連続するletはインデントすべきか? などなど
スタイルは悩みますね。 今のところ連続するletもinの後も インデントしないようにしています。 ただ、こう書きたいという思いがあっても Vimのインデントファイルでは うまくいかないことがあって困ります。 ユーザーの多そうなEmacsを使った方が いいのかもしれません。ま、それを 言ったら関数型言語もHaskellということ になるかもしれませんが…
Ocamlで let plus x y = x + y があるとき xより先にyに代入する方法はあるますか?
λ式を使えば良いのでは。 すでに、y = aの代入が決まっているときは、 (fun x -> plus x a) まだのときは、 (fun y -> fun x -> plus x y) を使う。 ※SML使いなので、構文上の間違いはあるかもしれぬ。
これも、一種のスタイル問題だが、 列挙型を定義するときに、 datatype X = X1 | X2 | X3 | ... とするか type X = int val X1 = 1 val X2 = 2 ... とするかで悩んでしまう。最初は、vector (ランダムアクセス)を使わない 見込みだったのだが、必要になったときのことを心配してしまう。
そういう心配をしなくていいくらいコンパイラの最適化は賢いから安心して代数データ型を使えという話をどこかで見た気がするのだがどこだか忘れてしまったな。
succ X1が欲しいという話だと思ったんだが。 ……俺ならObj.magicしちゃうな
>> 308, 307 ありがとうございます。そうです、O(1)で整数に変換できるかを心配していました。
O(1)での変換速度を気にしなきゃいけないくらい沢山定義するなら、 DEFINEマクロ使った方がいいんじゃないかなぁ。あ、OCamlの場合だけど。 (* compile with -pp "camlp4orf" *) DEFINE A = 1 let _ = print_int A
>> 311 Ocamlマクロ使えましたね。いいなぁ〜
破壊的代入(参照型)の利用はひかえめに、とはいろんなガイド/教科書に書いて あるけど、どの程度が許容範囲なんだろう。 与えられたリストの部分和を要素とするリストを返す関数を書いてみると、 破壊的代入を使ったバージョンが一番短く直観的に思う。 fun series xs = (fn s => map (fn i => i + !s before s := !s + i) xs) (ref 0) fun series2 xs = (rev o #2) (foldl (fn (i,(s,ys)) => (i+s,(i+s)::ys)) (0,nil) xs) fun series3' s (i::is) = (i+s) :: series3' (i+s) is | series3' s nil = nil; val series3 = series3' 0 関数プログラマ的には、どれがいいのだろう。 (もっといい書き方もあるかもしれない)
個人的にはこだわらずに破壊的代入もがんがん使えって思うけど、その前にmapの捜査順は前からって保証されてるのか?
確かに、一般的には規格違反かもしれない。ちなみに
http://www.smlnj.org/doc/basis/pages/list.html には
map f l
applies f to each element of l from left to right, returning the list of results.
と書かれているが、"from left to right"を副作用を持つfを考慮して、そう書いているのか
は不明。
>>313 効率気にしないなら下のようにも.
fun series nil = nil
| series (h::t) = h :: map (fn x => x + h) (series t)
効率を気にするなら,series3がいいと思った.
refを使うと現在の変数の状態を気にする必要があって大変.
series2はやってることはわかったけど,コードがなんとなく見づらい.
>現在の変数の状態を気にする必要があって大変 refが大変で、引数変数が大変でないと思う辺り、関数型言語プログラマだなあ。 俺はまだそこまでの境地には達してないや
「こんなこともあろうかと」いいながら、用意しておいたscanlを使うのが一番直感的。
なるほど scanl か mapAccumL で満足しそうになっていた
>> 316 ひさしぶりに何か美しいものを見た気がします。 >> 318,319 HaskellのData.Listにある関数ですね。GHCは入れてあるが、ほとんど使って いないので、知らなかったのですが、いっぱい関数が用意されてますね。
NJに付属するCMLって、multicore対応じゃないみたいですね。 (tar ballのToDoに書いてあった) ノード内並列には使えない。残念。
SML なら Poly/ML がネイティブスレッドに対応してるよ
>>322 ありがとうございます。
ここを
http://www.polyml.org/Doc.html さらっと見てみましたが、
結構しっかりした実装のようですね。
これは、SML/NJからの移行を検討する価値がある。
他に、
- Windowsプログラミング
- FFIが簡単(のように見える)
が気に入った。
MLでGUIプログラミング、って時々やろうとするんだけど準備が面倒で挫折する。 lablgtk2とその依存ライブラリを標準で取り込んでくれ〜
ファンクターでモジュールを作ったときに実行される関数がほしいんだけど OOのコンストラクタみたいなの
>>325 module F (A : sig val x : int end) = struct
let _ = print_int A.x
end
このファンクターに適当なモジュールを適用してごらん
MLが関数型言語とか、最初に言い出したのは誰なのかしら
\ / \ 丶 i. | / ./ / \ ヽ i. .| / / / \ ヽ i | / / / \ -‐ ー __ わ た し で す -- 二 / ̄\ = 二  ̄ | ^o^ |  ̄ -‐ \_/ ‐- / / ヽ \ / 丶 \ / / / | i, 丶 \ / / / | i, 丶 \
プログラミング言語ML
http://www.amazon.co.jp/dp/4756116418 J. D. Ullmanのこの本絶版になってたのか。
11年前に図書館で世話になったときは、面白かった。
OCaml出たばっかりなのに人が少ないってどういうことなの
windows用の最新版は3.11.0ってことですか?公式のリンクが切れてるという。。
自分でビルドすればいいし、URLの修正ぐらい自分でやればいいし
windows 3.11.0
http://ocaml.jp/Chapter%2024%20The%20threads%20library >threads ライブラリを使用するプログラムは以下のようにリンクしてください:
>ocamlc -thread other options unix.cma threads.cma other files
って書いてあるのに
ocamlc -thread unix.cma threads.cma thread.ml
File "thread.ml", line 7, characters 8-21:
Error: Unbound value Thread.create
Threadはどこにあるんだ・・・
いっこうにMacPortsにこねえ>3.12.0
なんか既存アプリ壊してるとかあるのかね
>>337 志村ー、"thread.ml"ー
>>337 圧倒的感謝
悩んでた自分が馬鹿らしい つーか馬鹿だった
unitをどうやって代入させるかで数分悩んでしまった。
最近SML#が活発に更新されているようなので、0.56インストールしてみました。 集合演算を使ったプログラムを書こうとしているのですが、 CM周りの問題のせいか上手く動きません。 例えば、sml#では、 # structure SSet = RedBlackSetFn(struct type ord_key = string; val compare = String.compare end); stdIn:1.18-1.94 Error: unbound functor: RedBlackSetFn となります。smlだと、 - structure SSet = RedBlackSetFn(struct type ord_key = string; val compare = String.compare end); [autoloading] [library $SMLNJ-BASIS/basis.cm is stable] [library $SMLNJ-LIB/Util/smlnj-lib.cm is stable] [autoloading done] structure SSet : ORD_SET? と上手く動いています。 どのあたりを調べれば良いかのポインタだけでも構いませんので、 解決方法ご存知の方、教えていただけますでしょうか。
SML#ってMSの.Net系言語だと思って無視してたんだけど、
全然関係無しなんだね。まぎらわしすぎw
解決方法でないレスでゴメソ
>>345 >>345 SML/NJだと自動でライブラリを読み込むようだが,SML#ではそうでないみたいね.
ソースの smlsharp-0.56/smlnj-lib/Util/redblack-set-fn.sml
にRedBlackSetFnが入ってるから,必要なファイル込みでuseすればいいんじゃないかな.
>>347 $prefix/lib/smlsharp/smlnj-lib/Util 以下に各set用のfunctorが
あったので、こちらをuseしてみたところ、
上手く動くようになりました。
ありがとうございます。
sml#ではCM上手く動かないのはやっぱり嫌だなぁ。
なんとかならないものか…
初歩の初歩ですいません、symbolic nameって何? ML for the working programmerを読み始めて早速引っ掛かってしまいました。
Jane StreetのCoreってOCaml 3.12に対応してる? コンパイルに失敗する
遅レスだけど、桁数は80でインデントは4。 :se nu ai sw=4 ts=4
私も桁は80(インデントは2)。 でも無名関数を多用すると桁が足りなくなるので 増やすべきか悩む。横長モニタ買いたくなる。
通常は80に設定しているが、MLを編集するときは、120に増す。 とはいえ、100を超えると読みにくくなるので、適当に折り返すことにしている。 ただ、このコーディングルールに従えばOK、というようなのがないので、 毎回困っている。
>>305 解決策(SML/NJの場合の)が見つかった。
data label = A | B | C
Unsafe.cast A: int;
Unsafe.cast B: int;
Unsafe.cast C: int;
とすると、それぞれ0,1,2になる。
>>356 MLは初心者だけど、
>>305 は(コードの問題ではなく)設計の問題だと思う。
代数構造として、直積(組型やレコード型)と列(リスト型や配列型)は全く別の概念。
コンパイルの前に要素の数が決定できるなら直積を使うべきだし、
実行してみないと決定できないのなら列を使う。あるいは動的なシンボルで
ランダムアクセスしたいならハッシュ型を、更に順序性が必要ならB木型を。
これらすべてはプログラムの設計工程で決定しておくべきもの。
設計工程での不具合をコーディング工程で取り返そうとするのは、よくある過ち。
>>356 の解決策というのは、いわゆる「泥縄」的手法。いずれ破綻する。
いくらMLが美しい言語でも、設計が汚ければコードはグチャグチャになるよ。
逆に、設計が適切であれば手続き型言語であっても美しいコードは書ける。
そんな大仰な話でもないだろ。 Pascal、Modula系からMLやら(その他EiffelやらOberonやら)への流れで、 なぜか列挙型を配列のインデックスに使う機能が捨てられた悲しいね、ってだけの話だ。
だから「なぜ列挙型を配列のインデックスに使う機能が捨てられたのか?」という 疑問の答えを考えなさい、と言ってる。 列挙型(特に関数型言語の直和、MLのdatatype定義)というのは、要素を数え上げることで 集合を定義している。いわゆる「内包的定義」だ。集合なのだから、その要素間に順序性は無い。 もし要素間に順序性が求められるのなら、列として(集合とは別に)それら要素を定義する。 そしてそれらの間の関係を写像(関数あるいはハッシュ型などで)させることで対応づける。 こういった考え方(設計技術)無しに、力任せのコーディングテク(技法)で解決しようとするのでは、 (特にMLのような明瞭な型体系を持つ)関数型言語の利点は、全く生きないよ。 型をわずらわしく感じるうちは、いつまでたってもIT土方のままだ。(型定義 = 設計なのに....。) 結果的に「関数型言語を使っても美しい(高品質な)コードは書けなかった。チクショウ騙された。」 という誤解が生まれる。
>>357 305が既にコーディング工程まで来ているという根拠は?
>>359 とか自分で読み返して恥ずかしくないのか?
列挙型がインデックスの配列なんて、単にmapの効率的な表現でしかないだろ……。
あと「なぜ列挙型を配列のインデックスに使う機能が捨てられたのか?」は 単純に(非常に残念ながら)固定長配列型が採用されなかったからだろうね。 全部可変長配列ならインデックスに演算不可能な型を使えてもしょうがないから。
>>357 根拠は、
>>305 が使った「スタイル」と言う言葉。
>>361 >単にmapの効率的な表現でしかないだろ……。
その通り。より正確には「写像の効率的な実装(コード化)」だね。
>>357 で書いたのは、実装(コード化)で解決しようとせずに設計に立ち返りなさい、という話。
正直「いちいちmap作るの効率悪い&めんどくさいからちゃっちゃとUnsafe.castしてしまえ」ってだけの話なのに 設計どうこうの話で絡む理由がわからんな。 それこそ言語機能の問題でしか無いんだから、実装の詳細もいいとこだろうに。
そうだね。プログラミング言語なんて道具にすぎないんだから、本人がどう使おうが自由だし。 下流工程で延々とモガき続ける、いわゆる土方から抜け出せるよう助言したつもりだったが、 余計なお世話だったかもしれない。これで落ちるよ。
だから、その本人が今現在下流工程にいるという根拠はなんなの?
大体設計としてはインデックス値集合からのmap確定で、見直す要素なんて全く無いだろ。 余計なお世話どころか、勘違い甚だしすぎる。 SML使う土方現場なんて日本にあったら俺が行きてーよw
落ちたつもりだったけど、自分のカキコにアンカ間違いがあったから、そこだけ訂正。
>>366 スマン。
>>363 の
>
>>357 >根拠は、
>>305 が使った「スタイル」と言う言葉。
という部分の
>>357 というアンカは間違いだった。
>>360 宛のレスとして読み直してくれ。
305&356です。 私はただの数値計算屋なので、このような助言はありがたい。 型の設定は大切にしています。ただ、研究用のプログラムなの で、予想外の変更が生じるし、過剰に一般的に作ると使いにくく なるので、なかなか難しいところです。 いまの問題でゆうと、対象の要素数が100とか1000であれば、 ハッシュを使う選択をしますが、当面の問題では、10以下の 固定個なので、列挙子を使いたい訳です。これは、NJの対話型 環境で式を評価したときに、 列挙子名が表示されるためです。 ※NJのハッシュは組み込み型であるvectorほど使いやすくはない ので、ハッシュを避けがちになるという別の問題はある。 なおUnsafe.castは前にOcamlにはmagicがあるという話が出たの で、備忘録的に書いただけです。
ML が研究されているという情報。 それも国内で。 結構なことじゃないの。
ようやくMPIを使っての並列起動に成功した……。Intel MPIの32bit版 が使えることのに気付くのにも時間が掛かったが、まさか、.cm/への 書きこみで競合が起こるとは想像だにできなかった。
windowsでグラフィックスを扱うライブラリ としてsml_tkがあるようだが、Posixストラクチャ とか使っててコンパイルできない。
standard MLとかって、もう終わった言語なの?
NJのバージョンはときどき上がっているようだが、64bit版の開発が着手される 気配はないねぇ。
ええ。 ocamlのobject的な機能って使ってる人いるのかね?
>>384 あなたやその他の人が誰も立てないから。
「最近、関数型言語が流行ってんだってね?」 私にそう言ったのは、大法螺吹きの異名で名高い営業マン。 もちろん、彼はプログラミングのことは全然知らない。 たぶん関数型言語のこともどっかのポルノ雑誌ででも読んだのだろう。やれやれだ。 「岡村ってのが新しいらしいね。」 なんだよ、その岡村って…。もしかして日本人の開発した関数型言語か?岡村って誰だよ。 「やねさんなら、当然、岡村、使ったことあるよね?」 使ったことあるどころか、名前すら知らんよ。なんだよ、岡村って…。 「あれー?やねさんともあろう御人が、岡村も知らないとは…」 いや、マジで知らんよ。なんなんだよ、それ。 「そうかー。知らないのかー。やねさんでも知らないのかー。」 そう言われて「なんだかなぁ」と思いながら帰ってきて、「関数型言語 岡村」でググって見たけど、そんなの出てこねーよ。 「なんだよ、また、いつもの大法螺かよ!」と思って、布団に入って寝てたら、深夜の三時に、「もしかして、岡村ってOCamlのことじゃね?」と夢のなかで気づいて、いま悔しくて壁を思いっきりグーパンチで殴ってるところ。
おいおい、岡村!アラン、見ランダ? Yacc束してたのに、Matlab。 あだー。アラン、隙間フェチ、すから。 見つけるのは一苦労じゃろーね。Sque無い 嗚呼、くっ。一緒にエイダみる予定だったのに・・ 遅coqしたら理彩のレイジがMaximaになる メーリングリストで蓮家等に聞いてミルか Amigaとう。んじゃ,またAgda! Orc、またAgdaな
NJのUnsafe.castのあまり意味のない使い道 (fn x => x (Unsafe.cast x)) (fn x => (Unsafe.cast x))
type 'a safe = Safe of ('a safe -> 'a);; let safe (Safe x) = x;; print_char((fun x -> safe x x) (Safe (fun x -> safe x x)));;
>>392 OCamlならこんなかんじ?
(fun x -> x (Obj.magic x))(fun x -> x (Obj.magic x));;
OCamlに興味が湧いてとりあえず五十嵐某の書籍買ってみた。 で、技術書買って真っ先にやることと言えば正誤チェック。 つ・・つかえねぇ・・・この本 誤謬の嵐だぜこりゃw 量がハンパネェ 本として機能してない 残念だがゴミ箱へ
>>395 うん?
自分にとっては、haskellの学習に大きく寄与したぞ?
コラムの再帰に関する格言と、その本質に言及した言葉が無かったら、関数型言語を挫折してた
(関数型言語の魅力が解らなかっただろう)
自分は、この人にhaskell版を書いて欲しいぞ
今なら言える
手続き型言語は全体的に(それをするには)「どうする」で作り、関数型言語は、全体的に(それは)「何か(あるいは、どんなものか)」で作る言語だと
>>395 俺も最近買ってしまって読んでるんだが、誤植の場所を教えてくれ。
素人でもわかるものなのか?
>>395 > 誤謬の嵐だぜこりゃw
>>398 > 俺も最近買ってしまって読んでるんだが、誤植の場所を教えてくれ。
「誤謬」のある本と「誤植」のある本の違いは大きい。
本当はどっち?
>>400 すまん。ちゃんと見てなかった。誤植じゃなくて誤謬か。
で、どこなんだろう。
>>401 両方。誤植も誤謬もある。
http://www.sato.kuis.kyoto-u.ac.jp/ ~igarashi/OCaml/
技術書でこれだけの間違いがあったら、どうやって本として機能するんだろう?
間違いは無いに越したことはないけれど、 これぐらいの量の間違いは大したことないと思う。
> 自分は、この人にhaskell版を書いて欲しいぞ アマゾンで下のレビュー書いた人かいw
ちょっと困っていることがあるので、助けてください。 ヨウ素がリストの参照になっているようなベクトルを用意して、各要素に データを追記していくような処理をさせると(具体的には、複数の時系列を記録 したファイルがあって、これを時間順に読む)、追記回数の自乗のオーダの 処理時間が掛る。リストの先頭に追加しているだけなので、線形時間でやって ほしい。
(* コード例) val bigV = Vector.tabulate(1000000, fn _ => ref (nil:int list)) val dat = Vector.tabulate(1000000, fn i => i) val t0 = Time.now(); val tLast = ref (Time.-(t0,t0)); fun showTime() = let val tLast' = !tLast val () = tLast := Time.- (Time.now(), t0) val dt = Time.-(!tLast, tLast') in Time.toString (!tLast)^","^ Time.toString dt end fun append k = (print (Int.toString k ^ "," ^ showTime()^ "\n") ;Vector.app (fn box => box := k :: !box) bigV ) val () = Vector.app append dat
辞書(と見逃した自分も)がそっち方向に過学習してしまったらしい。すまん。
自分の環境ではサンプルプログラムの実行に二乗オーダは見られなかった。 bigVの大きさを一桁下げると速度がぐっと変わるし、GCとかのせいな気がする。
SMLの勉強していて思ったけど、最初に学ぶ言語として関数型言語はやはり難しいかも知れない。 C言語だとHello Worldから始まって、リスト処理は構造体とポインタの応用問題という位置づけだった。 SMLはいきなりリストと再帰の話から始まるw BASICは、LISPよりも後から開発されて、しかも同じダートマス大学発祥だけど、 リスト処理が実装されていないのもそれなりの理由があったのかなと思う。
>>415 > BASICは、LISPよりも後から開発されて、しかも同じダートマス大学発祥だけど、
> リスト処理が実装されていないのもそれなりの理由があったのかなと思う。
LISPとBASICじゃ作られた目的が全然違う
それに当時の計算機の性能ではリスト処理は時間的にもメモリ的にも大変重い処理だった
今の感覚や価値観は60年代の計算機や言語・ソフトの評価や判断には全く通用しない
最初は易しい言語で、ってことが重要に思えるところ、 その信念に基づいた妄想を長々と書きこむところ、 これはその人の性質をよく表していると思う。 こういうひとのためにも緩い言語は必要。 ML系はそういうのとは全然違う。
>> 415 ポインタ+構造体+慎重な操作を免除して、いきなりリストが使えるのが 売りだと思うのだけれど。 また、MLは破壊的代入+whileループが特別な儀式をしなくても使えるの で、再帰を学ばなくてもある程度は使える。
眉間のτとλ皺が特徴。 やつを追う前に言っておくッ! おれは今やつのStateTをほんのちょっぴりだが体験した い…いや…体験したというよりはまったく理解を超えていたのだが…… ,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれは奴の前で階層を lift していたと i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにか lift が消えていた』 |リ u' τ ,ノ _,!V,ハ | /´fト、_{λ{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった… ,゙ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} ∀:::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ キャストだとかサブタイピングだとか / // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
Ocamlとか関数型言語とか難しいことはよくわからないが ターミナルでTwitterクライアントが動くらしいので Ocamltterに手を出してみる。 そういえば親父がLISP好きだったのを思い出す。
OcamltterあきらめてOcaml入門やってるんだが再起呼び出しとかちょっと難しいな。 for文と違う。 数学者にやらせると面白いことになりそうな謎のワクワク感を感じる言語ではある。
みんな Haskell に移行してしまったんかいなぁ
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな ゴミの分際でw
>>427 科学計算を主に念頭においてるものだったら、Python一択になってくるよ。
それだけライブラリが充実している。scipy,numpy,matplotlib,mayaviなんて
のがあるからね。
>>415 手続き脳から見れば当然難しいけど、数学の漸化式を知ってれば再帰は
馴染みやすいし問題ないよ。難しくしてるのは頭の中で無理やり手続き型
に想定して理解しようとする癖があるからだよ。手続き型に染まった連中が
苦労するのはその悪癖が抜けないから。
リストとか関数の取り扱い(Cでいうと関数ポインタだな。)は手続きにとって
みれば高嶺の花だけど、そこが一番簡単にさせている要因なんだよね。
手続きに染まった人ってただ頭が硬直しただけなんだよ。
ファーストクラスの関数を、関数ポインタのようなもの、とかいうのは、 誤解を招くだけでないかな。
>>429 じゃあどう簡潔に言えばいいか示してくれ。それだけでいいよ。
>>431 手続き脳の人相手に話をする場合、それで通じれば問題がないけど
彼らの試行の中で比較的近いものを取り上げて説明しようとしないと
たぶん、言葉が通じないと思うよ。CS専攻の連中相手に話をするならば
それで問題はないよ。もし知らなければ不勉強だってことだからさ。
それはもうポインタでも何でもねぇw クロージャは、下手にCの概念で説明するよりは、定義をしっかり伝えたほうが、 相手に伝わりやすい代表例じゃないかな。モナドとか継続とかと一緒で。
一応Cでもgcc拡張ならクロージャはある C++ユーザならC++用語で言うファンクタ(関数オブジェクト)を結構使うはずなので、 ただの関数ポインタとの違いはわかっていると思う クロージャが近いのは勿論ファンクタのほうだけど、C++のようにいちいち classやstructでそれを記述する必要がない もっともC++のそれがあまりに面倒くさかったので、C++でも0xでついにlambdaが 導入されたわけだけど
>>435 >一応Cでもgcc拡張ならクロージャはある
nested function の事なら、内部関数から参照している変数のスコープの
外からは使えないのでクローズしているとは言えないんじゃないかな。
http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html C なら Blocks を使う方が良さそう。
>>438 そこを読むとinner functionのアドレスを取れると書いてあるけど、
upward funarg problemを解決しているわけではないの?
>>439 環境を保存しておいてくれる訳じゃないからね
>>440 なるほど。危険ではあるが役に立つかも知れないから機能は提供する
ということか。
OCamlにしようか、それともHaskellにしようか迷ってます。 こういう用途ならこっちのほうがいいとか、なんかアドバイスお願いします。
>>443 こーいうやつはプログラミングの勉強自体が目的だろ。
>>444 プログラミングの勉強自体が目的ならhaskell一択
>>444 はい、その通りです。
PHPとJavaとJavaScriptはある程度書けますが、関数型言語をなにかひとつみにつけようと思います。
>>445 よろしければ理由を教えてください。
ぐぐった感じでは、haskellはモナドというのが難しくて多くの人が挫折しているようので、OCamlに傾いてます。
>>446 勉強ってことだし、関数な考え方を得ようってなら純粋なHaskellの方を推奨
あと入門用に、英語読めるなら、比較的平易な英文で書いてある
http://learnyouahaskell.com/ を挙げておきます。下の方にあるonlineを選ぶと、売っているものに近い内容が読めますよ。
OCamlの入門書が1冊、Haskellの入門書が数冊出てるからどれか1つ、 とりあえず借りるか買うかして、それぞれ第1章ぐらいやってみなさい。
>>446 関数型言語の特徴が余す事なく取り入れられてる
モナドは使う分には難しくない
使う分にはシンプル イズ ベストな書き方がやり易い言語
モナドを分からないと使えるようにならないと勘違いして脱落する人多いけど、モナドの理論的背景を理解する必要は無い
気になるなら気長に勉強しなされ
OCamlはループも有るし、副作用対策諦めてるし、手続き型言語に限りなく近い関数型言語って感じ
速いコード吐けるけど、昨今の関数型言語の特徴取り入れた手続き型言語が多い時代に勉強する意味は薄い
手続きばっかだっし、古典のschemeでいいんじゃねーの?
Lisp族はLisp族で悪くないけど、関数型プログラミングを今時勉強するならその選択はない。
>>452 カリー分と遅延評価がデフォルトで付いてない
自分で同じ事を再現とかは出来るけど、それじゃ関数型言語の学習とは違う
>>449 haskellスレで翻訳中って聞いたぞ
あと、kindleでサンプル読んだ限りじゃプログラミングhaskellの内容を砕けた言葉とイラストで書いてるだけに見える
内容的にはすでに翻訳されてるプログラミングhaskellで十分
みなさん、ありがとうございます。 OCamlスレなのにHaskell勧める人ばかりなので、OCamlに未練はあるけど、思い切ってHaskellやってみようと思います。
>>456 いや。。。
haskellもMLの子孫なんだが。。。
>>456 俺はHaskell→OCamlと来た。
どっち先でもいいし、両方やればいいんじゃないだろうか。
片方しかやっちゃいけない決まりはないんだし。
面白いことは何でもやるべきだよ。
ミニ四駆だって、マグナムセイバーを買う傍ら、ソニックセイバーも買っただろ。それと同じ。
そんなことはどうでもいい。OCamlのサイトが404だ。
http://caml.inria.fr/ocaml すごいタイミング
>>456 にはOCamlと縁が無かったんだな。。。
OCamlがOCamlとして生まれ変わった際のゴタゴタだそうだよ
http://twitter.com/#!/camlspotter/status/97519093602717696 >描いたのは俺!
>RT @y_echo
>RT @kinaba: なにがあったのwww
>RT @kikx これは変わりすぎだろ!
>RT @yoshihiro503 ちょ、 OCaml のサイトが激しくイメチェンしてる caml.inria.fr
>>465 http://twitter.com/#!/camlspotter/status/97683309177475073 >一つだけ皆さんに言っておきます。毎年この時期には OCaml には何かが起きます。
>それはリア充関係者がバカンスに行ってしまって連絡が取れなくなるからです。
> RT @ytomino ocamlがついに滅んだと聞いて(遅い
http://twitter.com/#!/camlspotter/status/97685810127716353 >てか週末にサーバ不調になったら48時間止まるのあたりまえやろ?人間として。
http://twitter.com/#!/camlspotter/status/97686190618181632 >と haskell.org が落ちたときには wktk してた人が言っても説得力ありませんな
とりあえずフランスの月曜日昼(日本時間21時ごろ)まで待ちましょう。
それまでに復旧しなければ長期化確定ですね。
Lisp族はいいぞ。でもclojureを触っているとhaskellの影響がかなり大きい。 ocamlも触ってみたいけど、いまHaskell勉強中なんだ。たぶん、来年くらいには やれればな。HaskellってLispと同じでプログラム作成までの抽象化も含めた 戦略を練るのに時間がかかる言語って感じがしました。Ocamlも同じなんだろうね。
haskellはデータ構造を作るプログラミングになるって、山本和彦さんが言ってた
>>470 Haskell影響は並列周りでしょ。
そもそもSTMはHaskell由来じゃないし。
他はもろLisp直系じゃん。
>>472 見た目だけで話してるでしょ?
実際に触ってみればわかるけど、無限ストリーム近辺の関数はHaskellと
かなり近いよ。takeとかその辺のことね。common lispでも自作する方法は
あってもこの手の物は標準でないしね。
だから、リストの取り扱いってがhaskellに近くなってる。
>>471 なるほど
>>472 > そもそもSTMはHaskell由来じゃないし。
でも中興の祖はHaskellの人(Tim Harris)じゃないっけ?
>>474 ミランダとかなの?よくしらないけど(wikiでちょっと見たけど、
haskellの親玉っぽかった。)
それはともかく、Clojureが関数型の大きな影響をかんじるのは
イミュータブルなところかも。あれのお陰で、副作用をもたせようと
思ったら基本的にSTMの部分を活用しなきゃならない。(java固有の
ライブラリは例外的なんだけど。)それと遅延評価言語だって
ところがcommon lisp を触ってる時よりhaskellの影響を感じやすいのかも。
あとは内包表記かな。wikiにはlisp,ML, haskell erlangが影響を受けた言語
とかかれている。
卒業研究でOCamlのライブラリ作ってます。 おもしろいことありますでしょうか?
>>479 どんなライブラリをつくったら面白いでしょうか?
なのか
ライブラリを作ることはテーマとして面白味があるでしょうか?
なのか。
MLの型推論の部分だけ「俺言語」の中に取り込みたい 型推論の部分だけ分かりやすくコンパクトにまとめられたコードどこかにないでしょうか
>>485 Prolog で型チェック:Rainy Day Codings:So-net blog
http://rainyday.blog.so-net.ne.jp/2008-06-16 題名は型チェックだけど、コードはまぎれもなく型推論
ああPrologだから単一化で型推論が起きるのか。
prologで型推定が一番楽にできそう しかし返値しか推定してないね
SMLやろうと思うんだけど、関数書いたファイルはどこ入れときゃいいの?
>>492 SML/NJの場合だと、適当なファイル(例えばhoge.sml)に保存して、保存した
フォルダでNJの対話環境を起動して、
use "hoge.sml"
とすればよい。useはカレントディレクトリからソースを読み込む関数で、
カレントディレクトリの取得/変更は、
OS.FileSys.getDirとOS.FileSys.chDirでできる。
型推論があるから簡潔になるのか パターンマッチがあるから簡潔になるのか
>>495 ひどいよな。C#じゃ複雑なデータ構造を扱おうなんてすると沼じゃないか!
今Haskellの勉強をしててOcamlは読んだことはなかったんだけど
読めるもんだなとも思った。
The C# code, while functionally equivalent, looks cluttered, with the real structure obscured by syntactic noise. 事実だけど、辛辣だな。
>>499 関数型言語群はMLの影響が強いからね。
C言語系という言い方では、ML系と言ってしまってもいい。
>>501 なるほど、ML系かぁ。そういわれれば納得です。
ocamlてmain関数的なエントリポイントって無いの? Pythonみたいな泥臭い方法でもいいんだけど.
具体的に OCaml で何をしたいのか、Python のどこがダサいのか 書いた方が答をもらいやすいよ
>>505 OCamlにエントリポイントはないです。__main__とかないです。
ocamlc -o a.out a.ml b.ml c.mlとしてコンパイルすると、
a.outの動きとしてはmodule A,B,Cの順番で評価されるイメージになります。
最近HaskellからOCamlに興味を持って少し触り始めたんですが,OCamlの対話環境にはghciの「:i 」みたいなものは無いんでしょうか?
toplevel の pretty printer を普通のプログラム内で使う方法ってありますか。
>>509 どしょっぱつの,Sometimes, が訳されていないとか,いろいろと
気になるところはあるけれど,大意は伝わった。うむうむ。
>>510 #install_printer のやつ?
The little MLerの情報って調べたけど少ないね。大学の図書館 とかなら有りそうに思うけど、今は大学と関係ないから探せんわ。 SML中心で書いてるようだ。Ocamlへの改変の仕方ものってる というのはgoogle booksでわかった。 使って学習した人っておらんの?
NACSIS Webcatで検索するか買えば? 面白いよ。
NACSIS Webcatか
http://webcat.nii.ac.jp/cgi-bin/shsproc?id=BA3501073X 意外とおいてるところ少ないね。今学習してる本が片付いたら
購入検討するわ。
MLってCACHEに使われてるんだっけ? RDBでないDBに興味を持ったので調べ始めたんだけど、 ML、CACHEとも事例が中々見つからない...
OCaml のモジュールについて質問です. たとえば A.B A.C A.D みたいにネストしたモジュールをそれぞれ分割されたファイル(a/b.ml, a/c.ml, a/d.ml など階層化されたディレクトリに分けられる?)に書くには OCaml ではどういう方法が一般的でしょうか?
MLの無名関数 (fn x => x + 1 みたいなの)って再帰的な定義をする記法はないのですか? fn n => n * (fn n-1) みたいな感じで。
>>524 どうしてもやりたいならY combinatorを定義して使うとか:
let rec y f x = f (y f) x;;
(y (fun f x -> match x with 0 -> 1 | n -> n * f (n-1))) 10;;
>>524 そのため(名前を付けて循環定義にするため)に let rec があるので
let rec と組み合わせればいいと思うんだけど、let rec と組み合わせたくない
理由とかある?
SML/NJでdatatype 'a tree = Empty | Node of 'a * 'a tree * 'a treeとかやっといて、適当な深い木を定義してやると 表示が"Node #"と出てきて省略されてしまうんだけど、略記せずに全部出力させる方法があれば教えて。
camlp4 使った奴でよくみる pa_* な名前の奴の pa って何の略なんだ?
>>527 以下2つに適当に大きな数字を書き込む。
Control.Print.printLength;
Control.Print.printDepth;
あと、
Control.Print.out
も便利。何もしない関数に置き換えると、エコーバックを消せる。
> 掲載画像とお届けする商品の表紙が異なる場合があります。ご了承ください。 とあるけど、どういうことだろう
>>534 >出版社: Addison-Wesley (2017/11/20)
2017年・・・
OCamlで int_of_float -0.7;; がエラーになるんですが、どうして? Error: This expression has type float -> int but an expression was expected of type int ちなみに、、 # int_of_float 0.7;; - : int = 0 # -0.7;; - : float = -0.7 -0.7はfloatじゃないの?何がダメなの?
中置関数 (-) : int -> int -> int ががっつり int_of_float を引数に取っているわけで。 int_of_float (-0.7) で使ってください。
>>540 そういうことでしたか!
ありがとうございます
OCaml コンパイルして、nativeなコード吐いて、不思議な実行のさせかたしてるのね
ねんがんのLittle MLerをてにいれたぞ OCamlの場合の読み替え方法も載ってるけど、素直にSMLでやった方が良いのかな てか読んでる人はいるんだろうか・・・
以下の関数でprint_int x という文を入れると構文エラーになってしまうのですが、何がいけないのでしょうか? let hoge x = print_int x ← これ if x=0 then 0 else x + 10 let test1 = hoge 0 = 0 let test2 = hoge 10 = 20 # #use "printtest.ml";; File "printtest.ml", line 3, characters 4-6: Error: Syntax error ← 原因は?
>>555 Thx!出来ました
セミコロンを使うのはインタプリタだけなのかと思っていました
調べてみたら、配列の区切りでも使われるんですね
print_string "あ、OCamlです。言ってませんでしたね。すいません¥n";
>>556 インタプリタの文の区切りは ;; (セミコロンが2つ)
逐次実行は ; (この場合セミコロンの前の式の型が unit でない場合警告が出る)
配列の区切りも ; (これは配列の括弧 [ ] の中でのみ出現する)
.net におけるOcamlがF#ですが、 JVM上でのOcaml相当のものはないのでしょうか?
>>561 おお、これってチラ見したときは単なるライブラリレベルでのサポートかと
思ってましたが、完全なJVM実装なんですね。
http://www.lexifi.com/ml2012/ 今年のMLワークショップでもocaml-javaの紹介してたみたい。
どのぐらい出来てるんだろう。
パフォーマンスの話も載ってた。
1/3ぐらい?
# type t = int * t;; Error: The type abbreviation u is cyclic # type t = { x: int; y: t };; type t = { x : int; y : t; } # type u = u option;; Error: The type abbreviation u is cyclic # type u = Some of u | None;; type u = Some of u | None だれか解説してくれ。
>>563 http://shootout.alioth.debian.org/ の中くらいのサイズのやつを8つベンチマーク。
0.96倍から7.14倍の実行速度。
3倍内に収まったのが6つあるぜ。
intを扱うベンチが遅い。boxingされちゃうから。
そういうベンチを省くと平均で倍は遅くない。
>>564 最初のやつは値を作れないし、三番目の型パラメータとして渡すようなのもoptionの中身次第では同じ事になるからじゃね?
と思ったが二番目が通るのがよくわからん。
>>564 (**** スマンがOCamlは久しく触っていないので、SMLで解説してみる -- 処理系は SML/NJ ****) - type t = int * t; Error: unbound type constructor: t (* まだ束縛されていない型構成子 t を右辺の型式内で参照しているからエラー *) - type t = { x: int, y: t}; Error: unbound type constructor: t (* 最初の例と同様に、型構成子 t はまだ束縛されていないのでエラー *) - type u = u option; Error: unbound type constructor: u (* これも同じ理由でエラー *) - datatype u = Some of u | None; datatype u = None | Some of u (* 上記のtype宣言文とは異なり、datatype宣言文であれば再帰的なデータ型定義が許されている *) (**** 以上だけど、SMLなら不可解な振る舞いは無く、現象を明解に説明できるよ.... ****) >>564 abbreviationではない新しい型がcyclicかどうかは仕様を決める人が自由に決める
一方、タプルとoptionがcyclicではないという仕様は既に決まっているので
タプルのabbreviationとoptionのabbreviationはcyclicではないはず
おお。皆さん回答ありがとう。
>> 566
値を作れないわけではなかったりする。
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# let rec loop () = loop ();;
val loop : unit -> 'a = <fun>
# { x = 0; y = { x = 1; y = loop () } };;
いや、作れてはいないんだけど、型は付く。
CPS っぽい感じのプログラムで最後に exit するような場合、こういう型が出現することもある…気がする。
tuple で許されず、 record で許されるのに何か理由があるのかと思ったけど、
>>567 さんの通り、 SML ではどちらも許されないそうだし、あんまり深い意味はないのかな。
>>568 人(言語仕様)が自由に決めるとして、なんでこんなチグハグに(素人目には)見える仕様に
なってるのかなーという。 record が通るってことは、どっちの仕様でも型安全性は保証されるのだよね?
それぞれの仕様の pros/cons が知りたい。
あと、 option の方は、処理系が option の内容を辿るように頑張って実装すればイケるのか、
型理論的になにか問題があるのかよく分からない。
ああ書いていて気づいた。 record は mutable なフィールドを許すから、 # type t = { x: int; mutable y: t };; type t = { x : int; mutable y : t; } # let rec v = { x = 0; y = v };; こういう循環している値を使うことが普通にあるわけで、 cyclic な型を認めておいた方が便利なのだ。 一方で tuple は常に immutable だから、無限ループになるような通常は起こりにくい状況でしか cyclic な型が出てこない。 たぶん。
久々にtuareg-mode使ったけど、インデントが変わったのな。 昔のはletをネストするとだんだん右に行って見づらかった
Ocaml関数引数の省略説明って簡単に嵌ってしまた let plus x y = x + y let incr = plus 1 incr 1 2 let minus x y = x - y let decr = minus 1 decr 2 -1 ???? let decr = plus -1 error let decr = plus (-1) decr 2 1 let decr x = minus x 1 decr 2 1 こんな感じww 途中で val incr : int -> int = <fun> こんな説明出てくるけど、何それ?ってw
例えばこの例は間際らしい let capitalize = function | 'a' .. 'z' as letter -> Char.uppercase letter | 'A' .. 'Z' as letter -> letter | _ -> failwith "Not a valid letter" これを、こう書き換えても問題ない let capitalize = function | 'a' .. 'z' as lett -> Char.uppercase lett | 'A' .. 'Z' as lette -> lette | _ -> failwith "Not a valid letter" 何が言いたいかと言うと、初見の場合as letter が何か特別な予約語に思えて混乱する(letterの綴りが省略されていないため) で、下のように書き換えて動作を確認した
これ let head_head = function | [] -> failwith "the list is empty" | []::_ -> failwith "the head is the empty list" | (h::_)::_ -> h head_head [[1;2;3];[4;5;6]] 1 とか、listのlistから、頭のlistの頭を取り出す関数なんだけど head_head [] head_head [[];[1]] とかはエラーを返すけど head_head [1;2;3] とかするとlistの要素がlistじゃないってエラーが出てくる この場合を検出してエラーを返す書き方が思いつかない 検出する意味も必要もないのかどうかも分からない
はい、たぶん 基本[[];[]]な形式、list のlist構造 でも、なんか色々自由がありそうと感じる分、制約とか制限についての認識が欠落してしまう 制約制限がないと意味不明のバクが爆発するから必須なんだけど なのに、魂が叫ぶ、もっと自由にやらせろ 間違って[1;2;3]な通常のlistを渡したときなんとか出来そうな思い込みをしてしまう。 []要素のないlist [[];[1;]] listの最初のlistが[]なlist [[];[]] 同上 [1;2;3] 必要な要件を全然満たさないlist構造
>>579 ,580
すいません
その通りで御座います。
let f = function | [] -> failwith "empty list" | [| _; (_, x) |]::_ -> x | _ -> failwith "the first array should be of size two" に f [[|(1,2);(3,4)|];[|(5,6);(7,8)|]];; でint = 4の結果が得られる でも、 エラー"the first array should be of size two"が表示される引数が上手く作れない システムが先にエラーを吐き出す。
# f [[|(1,2)|];[|(5,6);(7,8)|]];; Exception: Failure "the first array should be of size two". いかんのか?
>>583 ありがとうございます。
出来ました。
関数fの受け付ける
('a * 'b) array list -> 'b = <fun>
の形式がどの様な表現なのか直感的に理解できなかったので助かりました。
('a * 'b) array list形式の引数が与えられると
2番目の条件にマッチングできなくて、3つ目の条件で"the first ~~ two"が表示されるんですね。
[[|(1,2)|]] の様に表現するとタイプミスマッチとか処理系がエラーを出すと思っていました。
でも、('a * 'b) array list形式なので引数としては間違っていない。
結局、[1,2]と入力すると[(1,2)]と返ってくるのでlistの要素構造を勘違いしてた(この部分"[(1,2)]"を見落とし) [1;2]は整数1と2によるlist、これと[(1,2)]の省略した入力[1,2]と混同してた だから、[1;(2,3)]とか入力してエラー出されて??な感じ。 正しくは、[(1,4);(2,3)]と表現しないといけない。 [1,4;2,3]とタイプしても正しく[(1,4);(2,3)]と返ってくる こんな初歩的な部分で躓くとは、これではソースが読めないわけだ。
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html には書いてないけど、+ や +. って - -. と同じく二項演算子かつ単項演算子じゃないのか?
+. (1.0 + 2.0);; とか通るし。
Characters 4-7: +. (1.0 + 2.0);; ^^^ Error: This expression has type float but an expression was expected of type int
Characters 0-2: +. (1.0 +. 2.0);; ^^ Error: Syntax error
parsing/parser.mliを見ると確かにそうらしい | subtractive expr %prec prec_unary_minus { mkuminus $1 $2 } | additive expr %prec prec_unary_plus { mkuplus $1 $2 }
pervasives.mliにこんなん書かれてた 147 external ( ~- ) : int -> int = "%negint" 148 (** Unary negation. You can also write [- e] instead of [~- e]. *)
むしろ、
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html > val (~+) : int -> int
> Unary addition. You can also write + e instead of ~+ e.
> Since 3.12.0
> val (~+.) : float -> float
> Unary addition. You can also write +. e instead of ~+. e.
> Since 3.12.0
言語拡張が間に合わなかった感じだねこれ
Ad-hockぽいし
なるほど。+. が単項opとして機能するのは Since 3.12.0 からの拡張なのか。 で間に合ってないというのは 589 の環境のことか。最新の ocaml では通る。 色々ありがとうございました。
最近、OCamlを勉強し始めたんだけど、標準関数で int listを印字する方法ってありますか? REPLの出力みたいのを求めているんですが。
>>594 コンパイラ内部の関数をごにょごにょすれば別かもしれないけど基本的にない。
対象がint listって決まってるなら、自分で書いたほうが楽だと思う。
REPL環境に限定すれば実はREPLのプリティプリンタを使えたりするんだけど、 使ってしまうと単独の実行ファイルにできなくなる罠。
OCamlで、(=)等を渡す let check b f = if b then f 1 1 else f 1.0 1.0 みたいな関数を定義したいんですけど、こういったやり方は駄目ですか? そのままだとfはintを取ると推論されて?エラーになるので、 型を(f: 'a -> 'a -> bool)と指定してみたんですが変わりませんでした。
>>597 よくわからないけど、型環境に intかつfloat みたいなのが積めないからだめなんじゃない?
確かこういうときはヴァリアントを使えばよかったはず
type intfloat = E | I of int | F of float
let check b (f: intfloat -> intfloat -> bool) = if b then f (I 1) (I 1) else f (F 1.0) (F 1.0)
OCaml のはなしです。 module type IO = sig type 'a t val write: string -> unit t val read: string t val run: 'a t -> 'a val bind: 'a t -> ('a -> 'b t) -> 'b t end module MyIO : IO = struct type 'a t = unit -> 'a let read = read_line let write str = fun () -> print_string str let run m = m () let bind m f = fun () -> (run (f (run m))) end で Haskell の IO monad 風にできるのはわかったけど、 'a t を x -> b という関数の形じゃなくて、バリアント型で実現したい。 read に対応したアクションまたは write に対応したアクション、という感じで。 けど、どうやってもうまくいかない。誰か教えてくださいませ。
opamを導入して適当なモジュール(今回はextlib)をインストールして ソースコードにopen Extlibと書いたところExtlibが見つからないと言われてしまいました 何かパス通しのようなものが必要なのでしょうか OSはmacでhomebrewを使っています
よくわかりませんがOCamlFindを使えば良いのですね ocamlfind ocamlc -package extlib -linkpkg test.ml で通りました
活気が無いように見えるのはきっと皆コーディングに夢中なんだ。きっとそうだ。
MLに限った事じゃないけど、関数型言語を学び始めて思ったのは、なんで一次元(線形)リストベースに作られてるのかなって。 一番シンプルな一次元から始めたとして、その先にn次元、までは行かなくても2次元・3次元にして言語体型を考えてみるとかやった人いないのかな。 既にトライして無意味と分かったとか、今まさに挑戦中とか、そう言う話はあるのかい? メモリ空間が一次元空間だから、やるだけ無駄なんだろうか?
>>606 因果が逆。再帰がベースにあるのでリストが使いやすい。
特定のデータ構造をベースにした言語ってSQLくらいしか思いつかない。
>>606 Linked List は一次元じゃないと思う。
>>607 だったら再帰の考え方も拡張すればいい。別にデータ構造をベースにする意図ではない。
考え方の向きは相互に変わって良いし、そうする事で何が見えてくるか、こないとしたら何故なのかを考えるきっかけにすればよい。
>>609 考え方の向きが一方向なのは、関数(写像)が集合間における一方向のn:1関係だから。
もし双方向やn:m関係を扱いたいのなら、述語論理をベースにした言語にすればいい。
論理型言語であれば、リストも順序性がある一方向関係として自然に扱える。
そう言う話じゃなく、考えたかの向きってのは再帰→リストと発想する考え方の逆向き、と言う意味です。 これ以上の議論は無意味のようですね。終わり
>>609 関数型言語を学び始めてどれくらいだ。第一印象でリストベースなのかと感じても3日もすればそんなことないって分かるだろうに。
きっと俺と同じように慣れない酒で益体もないことを考えているんだろうけど。
n次元のリストを捉えるのに再帰が不十分なら拡張とか考えるけどさ、n-1次元のリストを再帰的に処理すればいいだけの話であって、拡張なんて必要ない。
再帰という概念の拡張に1次元->n次元の拡張は使えない。何の需要も喚起しない。
>>613 なれない酒で頭がいかれてるお馬鹿さんさようなら
「ひどい」と不平を言うよりも、進んでネタを振りましょう。
正直関数型言語がどんなところで優位を持っているのかわからん
OCaml でのゲームプログラミングに興味がわいて
MLGame
http://mlgame.sourceforge.net/ ってライブラリを導入しようと思ったのですが
準備段階であるSDL, OCamlSDL の cygwin への導入で
もうよくわからなくなってしまいました。
http://sourceforge.net/projects/mlgame/files/mlgame/cross-platform%20devel%20util/ cygwin ごと入ってるらしいパックもためそうとしましたが
cygwin コンソールの起動ができません。
あきらめてCで初心者向けのDXLibrary でもつかって
適当にやってればいいのでしょうか?
やる前から自分が興味を持ったことを投げ出すなよ やってみて、思っていたのと違ったらそのときに別の方法を考えればいい 要は関数型言語でゲームプログラミングをしたいんだろ? ならF# + DirectXを試してみたら? もしくはCygwinを捨ててLinux環境でMLGameに挑戦してみるとか MLGameなんて地雷臭がするから、いろいろと苦労しそう。その分、力は付くかもしれないけど。 どんな方法をとるにせよ、まずはある程度のところまで突き詰めたほうがいい
「プログラミングする」という観点においては Windowsはウンコということを肝に命じた方が良い
>>621-622 素早い返答ありがとうございます。
とりあえず OCaml + cygwin + へんなの は捨てて
F# + DirectX をためしてみます。
windoes はプログラム書くのにうんこなのですね?
Ubuntu いちおう VMware でつかえるけど
とりあえず win に F# インストールしてねます
明日
http://www.codeproject.com/Articles/121194/Managed-DirectX-via-F でもよもう
そっか F#だとAPIが叩けるんだな プログラム自体を関数型言語から入ると なかなかできない発想だなと思った
let foo () = let bar = baz () in begin (* fooを使ってunitを返すような処理がいくつか *) bar end 個人的にこれはダサいと思うんですけど他の書き方が思いつきません 何かありませんか?
何がダサいと感じるのかよくわからんので何も言えない
endの直前にbarをもう一度書かないといけないところがダサいと思うのです
#load "dynlink.cma";; #load "camlp4o.cma";; #load "Camlp4Parsers/Camlp4ListComprehension.cmo";; [x | x <- [1;2;3] ];; - : int list = [1; 2; 3] できた! すげー感動
[(x,y,z)|x<-[1;2;3;4;5;6;7;8;9;10];y<-[1;2;3;4;5;6;7;8;9;10];z<-[1;2;3;4;5;6;7;8;9;10];x*x+y*y=z*z;x+y+z=24];; haskellの すごHの問題もできた! うおー俺は猛烈に感動している ところでhaskellの[1,2..10]って書いて[1;2;3;4;5;6;7;8;9;10]のリストを一瞬で作る機能は流石にないよな
>>631 残念ながら出来ない
それにしても楽しそうだねw
日本語が理解できない 自然数の集合から無作為に選んだ4個の数が存在して、この4つの中から、さらに無作為に3個を選んで和を取り、それを4回試行したところ、 180, 194, 206, 215 になった、ってことでいいの?
camlp4で今ある文法を制限することって出来ますか? 括弧無しのタプルを排除してリストの区切りをコロンにしたいのですが。
>>629 batteriesの関数ですよね?まさにそういうのを探していました
batteriesは何となく名前が気に入らなくてスルーしてましたが食わず嫌いは良くないですね
OCamlのクロージャはそれなりにコストがあって、最適化もしてくれないので
>>626 ぐらいならそのままにするなあ
初めての言語に関数型選んでしまったから Objectで詰んだ! さっぱりわからん
OCamlのobjectは忘れるんだ、そうすればお前は強くなれる っていうかfirst class moduleが入って、ただでさえ継子扱いだったobject/classに存在価値は無くなった
おっとwikiみたらCoqの日本語版が登場してた 俺がCoqネタつぶやいたから誰か追加してくれたんだな
CoqIDEでCtrl+Alt+↓ってやると 画面が上下さかさまになってビビったw どんなバグなんだよwww
coqideってのが何かしらんが俺のWindowsでもそうなる
>> 644 Coqのwikiってどこですか?私も気になります。
ディスプレイドライバの機能をCoqのせいにするなよ
CoqIDEの正当性はCoqで証明されておらんの?
http://www.cis.upenn.edu/ ~bcpierce/sf/
http://proofcafe.org/sf/ Coq自身はしらんが
Coqの元のOCamlの正しさは証明されてるっぽい
入門って書いてあるけど パラパラっと見たら全然入門じゃないんだけど・・・ 大学受験数学参考書の やさ理みたいな・・・全然優しく無いじゃんって
スレ違いも甚だしいが、お前らの英語力ってどんくらい?今まで技術書は大体は読めるからいいもんと思っていたのだが、
http://www.readingsoft.com/ ここで測ったらwords per minuteが115とかいうとんでもない数値だった。
英語ネイティブの人間と同じ量の本を読むのに数倍の差をつけられてて、マジで不安になった。
同じ時間を費やして得られる知識が圧倒的に少ないのは如何なものか。全然読めないじゃないか。
http://www.zynas.co.jp/genius/sokudoku/sokutei.html 日本語でどのぐらいよ
俺で1400字/分
英語だと20letter(s)/minぐらいだろなw 1ページ読む頃には熟睡モードだぜ
1025文字/分だった。日本語読むのは速い方だけどトップには及ばない。 自分は視力が矯正入れて0.7くらいだし、これ以上速くしようと思ったら怪しげな速読メソッドに手を出すしか無いのではと思っている。 というか1400って速すぎじゃね?すげーな。
103wpmに1080文字/分だった。
http://www.readingsoft.com/ は英文が平易すぎて、英語の小説読むより数倍速く読めたが……
>>657 73 wpm
理解優先で後戻りしまくったからな
テストと見せかけて宣伝文句を熟読させる手口とすぐに分かったw
>>660 読み易いように心を砕いて書いた文章と思った
146/wpm 100%だった もうちょっと早く読めそうだ
思いきり話の腰を折ってすまないが、 日本語英語に関わらず、知識やイディオム仕入れておいて、 理解速度自体を上げる方のが遥かに重要だから、 ページ送りが遅くても気にするなよ。
いやいやその知識やイディオムを仕入れる速度にもかかってくるのよ。読み書きの速度ってさ。 これ以上はスレ違いだし荒らしになるからやめるけど、上で挙げられてたSoftware Foundationsの和訳をして公開したCoqスレの住人達には感謝してもしきれん。
ホントこんなに価値ある情報を無料で提供してくれるって凄いよね
let goukei = 720;; let aa = 100 and bb = 350 and cc = 620 and dd = 705 ;; List.concat (List.map (fun a -> List.concat (List.map (fun b -> List.concat (List.map (fun c -> List.concat (List.map (fun d -> if a+b+c+d = goukei then [(a,b,c,d)] else []) [0;aa])) [0;bb])) [0;cc])) [0;dd]);; こんな感じでaa商品100円 bb商品350円 cc商品620円 dd商品705円があって 720円になる組み合わせを考えてみました ネストすればアイテム数をいくらでも増やせそうですが もっとスッキリ書く方法はありませんか?
batteriesありなら List.n_cartesian_product [[0;aa]; [0;bb]; [0;cc]; [0;dd]] |> List.filter (fun [a;b;c;d] -> a+b+c+d = goukei)
>>665 どういう意味?
和訳してた人が速読を推奨してたの?
>>669 opamやocamlfindの使い方分かる?
その辺の設定済んでれば、ソースの最初でopen Batteriesするだけ
>>671 わかんない
ググったらlinuxならできそうだけど
これwindowsで行けるの?cygwinってのが要る?
batteries-2.1.tar.gz をダウソしてきて cygwinってのから $ tar zxvf batteries-2.1.tar.gzすればええんやな
>>622 んなわけねえだろ
コンパイラ作ってる奴がクソなだけだ
やはりwindowsでOCamlならF#行った方がいい?
プラットフォームがWindowsに限定できるのなら、あえて茨の道を選ぶこともあるまい
F#ってべつにwindowsじゃなくても動くでしょ
動くけど、monoを入れる羽目になるし、.NET Frameworkが無いから旨さ半減
F#とOcamlって実行速度ちがってくるものなの?
.NETはJITコンパイルされるし、OCamlのネイティブコンパイラの最適化は最低限だし
Real World OCaml読もうぜ!OCamlSpotterの人も評価してたがAppendix A: installationでopam + core + utopをいきなりインストールさせるのはびっくりした。 こいつらガチでOCamlを普段使いにしてやがる。
>>684 実際、実務でOCaml使っている人たちが書いてるからね
って英語版も12月発売な上に 日本語版ってそれから1年後ぐらいになるのか
普段使いってどういうこと? スクリプト言語みたいに ちょこちょこっとのコーディングもOCamlって事?
プログラミング演習のようなの実装させるより Coreの拡張モジュールやp4使わせてるし 標準でやれることでもJane系にもっと便利なのあれば使ってる
あー opam installで途中で止まるー もう寝る
>>692 エラーメッセージはなんて出てますか? #opam
>>694 寝て起きたら終わってた
エラーメッセージらしきものが出てたら
まだググればなんとなく解決の糸口を探せるんだけど
止まったように見えるのは勘弁してほしい・・・
Ubuntuだと入ってるのかもしらんが Lubuntu入れたからm4ってのが足りなくて進まないのに難儀したわぁ
とりあえず opamからutopとcore入れたけど 他に入れといた方がいいってのある?
open Core.Std しても ウンともスンとも言わないのはどうして?
toplevelなら最後に;;付けないと評価されないぞ。
OSの問題か? UbuntuでbatteriesとかCore使えてる人いますか?
違うと思うけど 標準のモジュールは使える? open List;;とか
open List;;も #load "nums.cma";; も行ける
#use "topfind";; #require "batteries";; open Batteries;; でバッテリーつかえたぁぁぁ 疲れた でもCoreはスーパーユーザーやないと使えないんだけど emacsからスーパーユーザーってどうするんだ?
ってかここで聞く事じゃないけど .emacsなんてなんだよ・・意味不明
可能性1. Coreライブラリのパーミション指定がおかしいため、通常ユーザーでは読めない。(あまり現実的じゃない) 可能性2. opamをsudoで実行した。 可能性3. Ubuntuリポジトリにあるcoreパッケージをインストールした一方で、opam+findlibを個人権限で導入し、 そのため/usr/lib/ocaml/以下をfindlibが探していない。 可能性3なら、~/.opam/system/lib/findlib.confを編集することで解決する。
できた!ありがトン 端末たちあげたら先ず初めになんでも sudo -iしてたのがダメだったのかなぁ utopだと出来るけどemacsだと Error: Reference to undefined global Conditionsってでる うーん emacsの勉強が必要だなぁ core_kernelだと大丈夫なのはなぜなんだぜ? coreとcore_kernelって同じもの?だよね
>>709 /home/fuga/.opam/system/lib/findlib.conf
------------------------------------
destdir="/home/fuga/.opam/system/lib"
path="/usr/lib/ocaml:/home/fuga/.opam/system/lib"
ocamlc="ocamlc.opt"
ocamlopt="ocamlopt.opt"
ocamldep="ocamldep.opt"
------------------------------------
pathをちゃんとしてれば、Linuxディストリビューションが提供するocamlライブラリとopamで個人利用のライブラリが併用できる。
普通にopam導入したら/usr/lib/ocaml以下を無視して全部~/.opam以下に入れようとしてくる。
面倒だから俺もちゃんとしてない(findlibがシステムとユーザー両方にあって気持ち悪い)が、
OCAMLFIND_CONFを指定したり何だりすればいいらしい。気が向いたら試してみてください。
>>707 emacsの設定ファイルだよ。弄ってる間に学生生活が終わった。
SML#のページにあったスライドより: SML# は,Cやデータベースとの連携を備えた「ふつうの言語」を目指すML系関数型言語です. SQLをそのまま使える「ふつうの言語」...こいつ頭がお詳しいぜ! C、SQL、MLっていうのは欲張りだな。polyglotは楽しめるのかもしれんが。
let rec add_h a = function [] -> [] | h::t -> (a::h) :: add_h a t;; let rec powerset = function [] -> [[]] | h::t -> let pt = powerset t in pt @ add_h h pt;; let nedan_list list goukei = List.filter (fun xs -> List.fold_left (+) 0 xs = goukei) (powerset list);; nedan_list [100;350;620;705] 720;; 過去スレにいいヒントがあったのでそれを使って やりたい事を実現できました。 OCamlの素晴らしさを実感するとともに もっと良い方法があれば教えてください。
あー 数がちょっと増えるとすぐオーバーフローしちゃう これはダメだぁ・・・
let rec powerset = function | [] -> [[]] | h::t -> List.fold_left (fun xs t -> (h::t)::t::xs) [] (powerset t);; あ、自己解決 こうすれば20数個行ける
ごっちゃになってたけど print_string "hello"; print_newline ();; と print_endline "hello" が同じ意味なんだな print_string "hello\n" が普通の書き方?
その程度ならどれも意味がすぐ分かるから、特に伝統は無い。 改行コードはOS毎にLF+CRだったりLFだったりするけど、そこら辺はどう考慮されているんだろう。 Linuxだと\nで改行、\rで現在の行を消して先頭からやり直し、みたいだけど。他のOSでも統一されてんのかね?
副作用にも色々表現方法があって迷うなぁ まぁOCamlはそれがいいんだろうけど
文字列だけなら print_string とか print_endline とかでいいだろうけど、 数値とか含むのを出力するときはどうするのがスマートなんだろう? 俺はだいたい Printf.printf を使ってしまうのだけど。
>>721 間違ってる
Windows は CR+LF すなわち現在行を消して先頭に戻してから改行するのだッ
> Linuxだと\nで改行、\rで現在の行を消して先頭からやり直し、 OSのアプリが, 慣習的に "\n" を論理改行文字として扱ってる(tty ドライバーも このように扱いやすく作ってある)だけで, 端末制御として使う CR だとか LF とは 分けて考えるべきだと思うよ. 実際に tty を raw モードに設定すると, CR - LF("\r\n") を "\n" にマップする 作業はアプリの仕事になる. 端末から見た, 各制御文字の役割は以下であってそれ以外の何者でもない CR: カーソルを行の先頭に戻す, LF: カーソルを次の行に移動する(カラムは移動しない)
ocamlのcryptokit使おうとしたら、エラーになるんだがなんでなんだぜ。 Fatal error: cannot load shared library dllcryptokit_stubs Reason: dllcryptokit_stubs.so: cannot open shared object file: No such file or directory
#ocaml #opam 自己解決したっす dllcryptokit_stubs.so はopamゆーざーなら以下の環境変数の設定が必要っぽい export CAML_LD_LIBRARY_PATH=~/.opam/system/lib/stublibs/
なんかopamも便利なんだか不便なんだかわからんな
フィボナッチ計算させるときに メモ化するのもアキュムレータ使うのも 同じ振る舞いな気がするんだが 何か違うのかな?
それぞれの f(n)までの値をそれぞれ1回ずつ計算して テーブルに入れるかレコードに入れるかの違いだから 計算回数は同じじゃね?
呼ぶ回数=計算回数じゃないの? どっちもO(n)っぽいんだけど
fib(n) = fib(n-1) + fib(n-2) fib(n-2)は呼ばれるが、計算済みだから新に計算はしないってことでしょ。
let fib x = let rec fib_sub (x, accumulator1, accumulator2) = if x = 0 then accumulator1 else fib_sub (x - 1, accumulator1 + accumulator2, accumulator1) in fib_sub (x, 1, 0) こういう感じでアキュムレータ使うようなフィボナッチ
何が言いたいのかわからん 末尾再帰のアキュムレータだろうが、 fib nをm回呼び出す場合メモ化ならO(m+n)だろ
>>734 この
二重再帰の計算オーダーはそうじゃないだろ??
>>735 >>738 メモ化のコード書いてくれないとわからない。
あと計算オーダーはそうじゃないのそうって何?
>>738 >>734 の場合でも、f(n)はf(n-1), f(n-2)がメモ化されている場合常にO(1)
メモ化していない場合(最初の一回目)は再帰計算だからO(n)
これはわかるな?
その後 再帰メモ化版のfib(n)は、
それまでn以上の値が呼び出されていたならO(1)であり、
fib nをm回呼び出すならO(m)、2つ合わせて O(m+n)
アキュムレータだけの場合、fib(n)は "常に" O(n)
つまりfib nをm回呼び出すならO(nm)
わかったか?
HaMLet がまさかのニューバージョン。
http://www.mpi-sws.org/ ~rossberg/hamlet/
>>740 あー
>>734 はメモ化の再帰バージョンの話ね
理解した
とすると
>>729 この違いは
使い捨てならアキュムバージョンは
簡潔に書けて早く
使いまわすならメモ化した方が
再呼び出しは早くていいって感じか
SML#は64ビット対応せんのかな。結構期待してるんだけど。
int型のmaxって1073741823ですよね これを超えたらBig_intに切り替えたいんですが int型の計算でmax_intを超えたかどうかの判定って どうやったらいいですか?
無理じゃね 最初からBig_int使えばいいんじゃね
大学の研究室のプロジェクトだと、パワーのある院生がいる時にどかっと 進んだりするんだよなぁ。
キャリーフラグを無視しない高級言語ってごくわずかしかないよね。
そもそも1bit分フラグに使ってるからキャリーフラグなんて役に立たんでしょ SML#はどうか知らんけど
オブジェクトがさっぱりわからん レコードと何が違うんだ・・・
[Obj.magic 'a'; Obj.magic "abc"; Obj.magic 123];; すげー リストに型が違っても入るぞ 何に使えるんだろ?
Obj.magic 'a' + 1 ;; すげー こんなのもできるんだwwww 関数型言語界のgotoやで
OCamlって最強の言語じゃね? なんでみんなやらないんだろ
intが1ビット少ないとか、モジュールの仕様上スマートリンクができないとか ファーストクラスモジュールでOCamlのOたるオブジェクトがゴミになりましたとか そのファーストクラスモジュールは後付けで構文がカオスですとか、あと+.(笑)とかGC遅いとか ケチを付けようと思ったらいくらでも付けられるからなあ
Windows版の更新サボってるのが一番の原因だな
言語の素性はともかくマンパワーは全然足りてないしな
>>774 関数を計算の対象とすること、いいかえると、関数を引数として受け付けたり
関数を返す関数のことを「高階の関数」または「高階関数」という
さらに、高階関数の中で計算の対象が関数だけなものを「汎関数」という
つまり高階関数は広い概念で、汎関数は狭い概念
たとえば関数 map や filter は高階関数であるけれど、リストも計算対象だから汎関数ではない
それに対して、合成関数 o は高階関数であるし汎関数でもある
let foo f g x = g (f x) ;; val foo : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c = <fun> って合成関数があったとして 'aの引数は計算対象外になるの?
>>779 記法のせいでわかりにくいけど
('a -> 'b) -> ('b -> 'c) -> ('a -> 'c) って考えればいい
あと汎関数は量を返す物をいうはず。 だから合成関数は汎関数でなく、高階関数。
間違えた 合成関数を"返す" 関数は汎関数でなく、高階関数。
>>779 まず 'a は型変数だから、「'a の引数は...」という用法は日本語として不適切
で、もし質問の意図が「関数 foo の定義における第三引数 x は、関数 foo の計算対象外か?」
であるならば、答えは Yes
引数 x は関数 f の計算対象であるけれど、汎関数 foo の計算対象ではない
汎関数を定義する場合、
>>779 も決して間違いではないが、以下のように書いたほうが、
「x は(fooの引数ではなく)無名関数の引数である」という意図が理解しやすいだろう(言語はSML)
- fun foo f g = fn x => g (f x);
> val ('a, 'b, 'c) foo = fn : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c
>>781 では、その量を返すという汎関数の具体例を挙げてみてくれないか?
例えばmapをばらしたときに let rec map f ls = match ls with [] -> [] | x::xs -> f x :: map f xs ;; val : ('a -> 'b) -> 'a list -> 'b list = <fun> たぶんこんな感じで再帰になってるけど 無名関数は再帰で書けないから 無名関数で書けたら汎関数でよい?
>>783 >では、その量を返すという汎関数の具体例を挙げてみてくれないか?
なんで?
とりあえず、定義っぽいのは見つけたよ。
http://www.encyclopediaofmath.org/index.php/Functional ん?schemeはYコンビネータを使って Y = (λf . (λx . f (x x)) (λx . f (x x))) 無名再帰ができると書いてあるな 何が違うんだろ?動的言語だと出来るとか?
>>784 汎関数の定義に無名関数を使うことは多いけど、
だからといって、すべての無名関数を用いた定義が汎関数となる訳ではない
だから「無名関数で書けたら汎関数でよい?」という質問については No だ
ただし「引数としてある関数を渡すとmapと同等な無名関数を返す」汎用的な関数が
定義できるのであれば、その関数は汎関数であるといえるだろう
なお、再帰と汎関数は直交するから再帰を伴わない汎関数も存在する(たとえば合成関数 o)
したがって「再帰で書けたら汎関数でよい?」という質問についても No となる
>>785 数学における用語「汎関数」と計算機科学における「汎関数」をごっちゃにしているのでは?
で、ここは(数学板ではなく)プログラム板だ
>>787 >数学における用語「汎関数」と計算機科学における「汎関数」をごっちゃにしているのでは?
えええー!初耳だよそんなの。
計算機科学の汎関数の定義は?
同値再帰型なんてのもあるんだね OCamlって最強言語じゃね?
高階関数のままと 簡約した形と 評価までの速度に違いがあるのかな? 見やすさで選ばれてるだけ?
ゴルフに出てくる;;の後の 1@0 って何ですか??
コードゴルフか? 'a list -> 'a list -> 'a list じゃなさそうだし自分で定義してるんじゃね?
S式みたいに (< 1 2 3 4 5 6 7 8 9) でtrue みたいに一発で計算ってできますか?
let rec less_than lst = match lst with [] -> None | x :: [] -> Some true | x :: y :: xs -> if x < y then less_than (y :: xs) else Some false ;; なんか一行ですっきり書きたい
f op xs = and $ zipWith op xs (tail xs)
こうかな。 fun lessThanForAll l = ListPair.all (op <) (l, tl l);
camlp4ってなんか開発側のよくわからない方針により大幅に変更されてもともと乏しかったドキュメントが一層整備されてない状態になってから使う気なくした。
row polymorphism(< method_foo : foo -> bar ; .. >の"..")が何か泥臭い感じがしてOCamlのOが好きじゃないのですが、 row polymorphismとexact typeを区別するべき理由ってあるのでしょうか。
こんな本でた
JavaScriptで学ぶ関数型プログラミング
http://www.amazon.co.jp/dp/4873116600/ なんか面白そう
VBAを捨てて関数型言語がデフォルトでサポートされるのは、いつだろうか
ExcelマクロにVBAとF#の選択肢が標準だったなら、関数型は主流になれる
>>813 クオンツやアクチュアリーもどきの個体数が増えすぎて、
市場価値が下がらないように口を紡ぎだしたとみた
あれでしょ、世の中に不満があるなら自分を変えろ、それが嫌なら耳と目を閉じ、口を紡いで…あれ?
Batteriesを使用しているコードをjs_of_ocamlで変換するとMissing primitivesという警告?が出て JavaScriptの実行時エラーが出てしまいます これはどうしたら解消できるのでしょうか コマンド ocamlfind ocamlc -syntax camlp4o -package lwt,js_of_ocaml.syntax,batteries -g -c foo.ml ocamlfind ocamlc -package lwt,js_of_ocaml,batteries -linkpkg -o foo.byte foo.cmo js_of_ocaml foo.byte 出ているメッセージ Missing primitives: caml_ba_init caml_sys_const_big_endian caml_sys_const_ostype_cygwin caml_sys_const_ostype_unix caml_sys_const_ostype_win32 caml_sys_const_word_size create_nat incr_nat initialize_nat mult_digit_nat set_digit_nat set_to_zero_nat unix_inet_addr_of_string
いくつかはjs_of_ocamlを更新すれば定義されてる nat関係のは提供されてないのでダミーの関数を funciton create_nat(){}のように自分で追加するか batteriesのサブセットを切り出して使うか core_kernel使ってる人もいるらしい
js_of_ocaml 1.4.0を使っていますがこれではダメなのでしょうか? nat関係は適当にスクリプトを書いて対応しようと思います unix_inet_addr_of_stringはbatteries関係なく出てしまうようですね
bigarrayサポートがまだgit版にしかない unix_inet_addr_of_stringはruntime/unix.jsをリンクすれば大丈夫だけど opamで入れたなら多分入ってない
bigarrayサポートはnat関係のことですよね? もしそうだとするとcaml_XXXは一体何が原因なのでしょう それとunix_inet_addr_of_stringはopamで入れている以上直る?ことはないということなのでしょうか
調べてから書くべきでした caml_XXXがbitarrayの関数ですね
> それとunix_inet_addr_of_stringはopamで入れている以上直る?ことはないということなのでしょうか 公式のも唯の空の関数なんで自分で定義しても一緒だし 開発版では修正済みだから1.99だか2.0が出てopamパッケージになれば大丈夫
なるほど いずれ修正されることと今でも少し手を入れれば動くことがわかったので良かったです 親切にありがとうございました
toplevelで、コンパイルした自作のライブラリを使いたいとき、 #load "/foo/bar/my.cmo";; とやったのですが、モジュールMyが無いと怒られたため、試行錯誤した結果、toplevelで #directory "/foo/bar";; #load "my.cmo";; と2段階に分けるか、コマンドラインで -I /foo/bar としなければならなかったのですが、こんな不便な仕様が存在しているはずがないと感じました。 別ディレクトリにあるファイルを読み込む正しいやり方ではどうすればいいのでしょうか。誰か教えていただけたらと思います。 my.cmoは/foo/bar内で:`ocamlfind ocamlc -pkg batteries my.ml`とやって生成しています。
>>832 あ、使用しているOSはLinuxで、OCamlのバージョンは4.01.0です。
findlibのソースを読み、ocamlのソースを読んだ結果、不便な仕様は不便な仕様のようです。 諦めます。
初学者の質問で申し訳ないのですが、 type hoge ={ t : 'a. ('a -> 'a) -> 'a -> 'a };; という型で'a.('a -> 'a)の「 . (ドット)」は何を意味するのでしょうか?
∀x. P(x) とかλx. x のドットと同じなんじゃない。
>>835 型hogeは('a -> 'a) -> 'a -> 'aという関数tを持つものだよ、というだけなんだが、
まずその'a.っていう表記が無いとエラーが出る。
エラーメッセージに脊髄反射してtype 'a hoge = { t : ('a -> 'a) -> 'a -> 'a }と定義すると、
hoge型の値を作ったときint hogeとかstring hogeとかになって、
tも(int -> int) -> int -> intとかになっちゃう。
いや違う、オレはhoge型の値にidentity:'a -> 'aや(=): 'a -> 'a -> boolのように、多相性を持った関数tが欲しいんだって時に
'a.っていう表記を使う。
用途は何と問われるとちょっと困る程度にはマイナー。
aはずっと自由変数ですよ、特殊化されませんよ、ってのを明示するのに使うのか
基本的に、変数は(もし多相性を持っていても)初期化された時点で単相型になる
関数は呼び出されると引数が初期化されるのでその時点で単相型になる
関数自身を変数に入れると、呼び出してなくても変数を初期化しただけで単相型になる
>>835 のhoge型の変数は基本とは違って、初期化しただけでは単相型にならないっぽい
回答ありがとうございます。与えられたチャーチ数の定義がこれだったのですが、周りに聞いてもあまり良い回答を得られなかったので、とても助かりました。 確かにチャーチ数であれば、多相性が維持されなければ駄目ですね。
最近JITが高速と聞くのですが MLtonよりもJITが高速になる場合も あったりするのでしょうか
早くなるケースもあるけど 大抵のケースは、工夫しないと遅いので作り込みが大変 なので、大体が学生の研究で作って、終わっちゃうんじゃないかな。 速さというより、F#みたいにVM環境向けにbytecodeに落とし込むケースは、あるかも。 C言語の例だと、CERNで、HPのGotoさんが作ってたCINTというCインタプリタがインターラクティブ環境が必要ということで採用されてた。 現在は、規格に追従&共通基盤の恩恵を受けられるllvmベースのclingを開発中。
10年以上前だがJavaのShuJITとかあったけど、その作者のプロジェクトを終えるに あたってのまとめが、少々の理論的な優位点なんて、カネとヒトがたくさんある奴 (よーするにSun(当時)やIBMやHPの作ってるJVM)のパワーの前には吹き飛ぶ、 だった。
いまは、LLVM使うと巨人の肩に乗れるね。 JVMはHotSpotVMベースになってOpenJDKがオープンソースになってるからその上でいじれるように JSのVMは激戦だけど、IEの実装以外はオープンソースという。 LuaJITは、個人でつくってるのでオーパーツ。
言語処理系の最適化はマンパワーが必要なので……今はトレンドがLLVMに色々集まる方向性かな
コンパイラは、MLで作ると楽という話もあるが、、、 そこらへんはジレンマ?
>>848 js_of_ocaml ってJavaScriptで書くより最適化で高速になるからそういう方向もあるかも。
http://jsperf.com/js-of-ocaml Excelのセル中で、F#で定義した関数が使えたら面白いかもと思った。
LuaJITって個人のなの?ブラジル生まれだとは知ってたが。 あとllvmってコンパイラ基盤としては楽だけど、インタプリタとしてはちょっと難ありじゃないかしら。 適当に使うと最初の起動時間がかなり遅い。
Luaは、ブラジル、リオデジャネイロの大学の研究グループから LuaJIT作ってるのはドイツ、ミュンヘンの人
TAPLのexercise 3.2.5が分からん。なんで3.2.3の定義で S_i ⊆ S_{i+1} になるんだ? 各S_iは最初のS_1とかを除いて、disjointになるように思える。 本持ってる人教えて
ocamlの演算子、**より~-.の方が優先順位が高いのはなぜ?
OCamlの日本語の文字列扱うのて 上手く行かないものですか?
どの程度のレベルで上手くやろうとしているのか分からないけど、単純にstring型に代入、表示は何も無しでも動作するが、Stringモジュールは多言語に対応しているわけではない。String.lengthなどは狙い通りには動かない。 ライブラリ(Batteries, Camomile)等を使えば日本語できる。 と思ってBatUTF8を弄ってみたが、containsとかiterとかでBatUChar.tを取り扱う必要があるくせに、 BatUChar.t型を作る方法が面倒だなあ。of_digitしか無い。BatUTF8.get "あ" 0で誤魔化せるが、迂遠。
SML/NJ version 110.77 リリース! バージョン番号を4.0にリセットする前に、数回のリリースがあって、その中に64bitサポート が含まれるらしいが、今回はbugfixのマイナー・リリースらしい。 外部関数の32bitコンパイルがそろそろサポートされなくなりつつあるので、64bitサポートが はやくリリースされてほしい。
camomileの使い方が全然わからないんですがどこを読めばいいんでしょうか 主に文字コード変換と正規表現について知りたいです
OCamlのマニュアルにocamlbrowserがまだあるのはバグっすな ocamldoc/trunk/manual/cmds/Makefile line#2 remove "browser.tex "
ocaml標準のlexでは日本語が扱えないのでulexに差し替えたらparserが死んだでござる。 ダメだこりゃ
ocaml 4.01.0で # Obj.size @@ Obj.repr 1 がバグるんだけど、理由わかる?
仕様です。 ソースはおろかドキュメントすら読まずにObjを使うとはアホの極みです。 Chapter "Interfacing C with OCaml", Section 2..3
関数型とかマルチパラ代務とかドカタには無理。オブジェクトだって散々語られてようやく、いや未だ、か 一部の突出した集団以外は、ほかにどうしようもない人が沈殿する職業になってるイメージ
do構文の使用禁止の規約って全部>>=で書くってことなのだろうか。理由も含めて気になる。
>>872 前半で散々オブジェクト指向をこきおろしておきながら、
中盤でOCamlを推すという意味不明な文章の論理の展開がある
ML族を推すのなら Caml か SML にしないと一貫性が無いし、
Caml にオブジェクト指向を後付けした "O"Caml 開発時の判断は
今となっては流行に踊らされた大きな失敗であったと断罪すべき
おまけに「個人的にOCamlがすごいと思う」とあるから何かと読んでみたら、
単なるパラメタ型多相の話でしかないことに笑ってしまった
「とがった」とか「すごい」とか、小学生の感想文とレベルは変わらない
こんなポエム記事で給料をもらえるのだから、日経ITproの記者とは楽な職業だね
>>873 タイトル以前の問題で、記事に中身が無くて話にならん
>>876 ソースコード解析ツールなら言語処理系と似た構造になるから、
(一般的には副作用を模倣するために使われる)do記法を使う必要性は無いと思われ
ああいう煽り記事読んでドキドキするのは思春期の子供だけ もっと大人向けの真面目に面白い記事は無いのか?
もし完全無欠のプログラマが存在するのであれば、そうした方法論に頼らなくても、 完全に意図通りに動作するプログラムを頭から書き下していけばいいのです。 オブジェクト指向プログラミングや関数型プログラミングは、不完全な人間のために用意されたもの、 いわば「敗者の道具」といえます。 もちろん、これは極端すぎる表現です。例えば、人は空を飛べないので飛行機に乗ります。 このことをもって「飛行機は敗者の道具である」と言う人はいません。 そうした意味では、オブジェクト指向プログラミングや関数型プログラミングを敗者の道具と呼ぶのは、 単なる言葉遊びにすぎません。人間が全知全能でないのは当たり前ですから。 完全に朝日脳だな
対話環境を再起動せずに、リコンパイルしたライブラリをロードし直す方法ってありますか? #load でもう一度ロードすると、シグニチャが異なると怒られてしまいます
OCamlで型クラスを実現する方法ある? あとカインドも
モジュールで型クラス的なものを作ることができる。便利とは言いがたいが
Haskell より OCaml の方が部分部分で好みなんだけど、 OCaml は最近何か進展とか発展とか無いのかな。
上から読んでいけば何しているのか分かるOCamlのソースは読みやすい部類 batteriesとかcoreといった大きいライブラリでも、モジュールと同名のファイル見ればいいだけなので、 どこに何があるのか探しやすい 基本的に手続き脳なので、haskellはどこから読めばいいのか分からない 悪名高いimport文のおかげでもっと読めない
OCamlなんとなくソースの見た目のバランスが悪いっていうのはなんかわかるわ。
ソースが読みにくい言語は致命的に生産&保守効率が悪い。
レコード型ある言語、多相レコードある言語、フィールドがファーストクラスにできる言語 おしえて。 ぜんぶもってるのがいい。
>>901 SML# という Standard ML の処理系は「ぜんぶもってる」よ # fun get_x {X = x, ...} = x; val get_x = fn : ['a#{X: 'b}, 'b. 'a -> 'b] # val point_2d = {X=1.0, Y=2.0}; val point_2d = {X = 1, Y = 2} : {X: real, Y: real} # val point_3d = {X=10.0, Y=20.0, Z=15.0}; val point_3d = {X = 10, Y = 20, Z = 15} : {X: real, Y: real, Z: real} # get_x point_2d; val it = 1 : real # get_x point_3d; val it = 10 : real Standard ML の場合、前2つは言語仕様で規定されているからすべての処理系で利用できるけど、 最後の「フィールドがファーストクラス」であることは仕様では要求されていない たとえば SML/NJ という処理系だと、上記のコードはエラーになる - fun get_x {X = x, ...} = x; stdIn:1.2-1.28 Error: unresolved flex record (can't tell what fields there are besides #X) SML# が独自に拡張したレコード型に関しては、SML# プロジェクトのホームページに 日本語の解説があるから、まず最初に読んでみるのがいいと思う ・SML#の拡張機能:レコード多相性 in プログラミング言語SML#解説 http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/2.0/ja/Ch7.xhtml ↑ありがと。 ほんとにぜんぶ!? フィールドファーストクラスなのその言語?
SML/NJってやつは、フィールドがファーストじゃないとして、
SML#ってやつはファーストなの?
ほかにも
>>900 全部持ってる言語とかあればおしえて。みんな。
1.レコード型、あるいは、それに類する型を持つ 2.レコード型(or それに類する型)の構造的部分型関係を扱える 3.できれば、多相レコード型とかそれと同様なのを持つ 4.できれば、レコードのフィールド名がファーストクラス ( x = [name = 3] : [name : int] なら nameがファーストクラス) これカバーできる言語ない? うえでおしえてもらったのしらべてみたけど SML/NJってのは1,2を満たしてそう SML#ってのが1,2,3を満たしてそう、 あと scalaが無名オブジェクトみたいなやつで1,2,3を満たしてそう? 型を一部か書かないとダメだけど ほかにこの辺でなんかいい言語ない? clojure? ってのが4みたして相だけどコンパイル時に型ちぇっくしてくれないよねそれ? うーんなんかない?
>>906 Standard ML のレコード型は構造的部分型関係を持たないよ 構造的部分型関係を持つレコード型に類する型を持つのは OCaml や Java いわゆるオブジェクト指向におけるクラスとそれらの間の継承関係のこと また「多相レコード型」という用語の意味が「パラメタ型多相なレコード型」 であるならば、Standard ML は多相レコード型を持つことになる ここでパラメタ型多相は、Java だとジェネリクス(総称型)と呼ばれている 結論として、Standard ML(とその処理系 SML/NL および SML#)は1と3を満たす 次にファーストクラスについて、>>902 のコードにおける関数 get_x の定義だけど、 「フィールドとはレコード値からフィールド値への写像(関数)である」 という関係に気付けば、その定義は以下のように簡潔になる # val get_x = #X; val get_x = fn : ['a#{X: 'b}, 'b. 'a -> 'b] (* SML/# *) つまりフィールド #X は(val宣言で)識別子に束縛したり、他の関数へ適用したり。 ある関数の評価結果として返すことができる こうした数値や文字列といった値と同等に扱える性質を指してファーストクラスと呼ぶ さらに上記の例は SML# だけど、SML/NJ も型システムが単純たから型推論に失敗するだけで、 データ型を明示的に宣言すれば関数 get_x を定義できる - val get_x = #X : {X: real, Y: 'a} -> real; val get_x = fn : {X:real, Y:'a} -> real (* SML/NJ *) 型システムの制約とファーストクラスという性質をごっちゃにすべきではない まとめると、Standard ML(とそのすべての処理系)のフィールドはファーストクラスである > - val get_x = #X : {X: real, Y: 'a} -> real; でもこの get_x って、>>902 の point_3d には使えないよね。 うん、使えない
それが
>>910 で書いた(Standard ML言語仕様における)「型システム」の制約だね
その制約を無くした SML# が特異なだけで、SML/NJ 以外の大半の SML 処理系に同じ制約がある
>>910 >Standard ML のレコード型は構造的部分型関係を持たないよ
>構造的部分型関係を持つレコード型に類する型を持つのは OCaml や Java
>いわゆるオブジェクト指向におけるクラスとそれらの間の継承関係のこと
自己レスだけど、この段落は間違いが含まれていたので訂正する
まず:
>Standard ML のレコード型は構造的部分型関係を持たないよ
この文章は正しいけど、SML# は「構造的」部分型関係に類する型を持つ
だから
>>902 の関数 get_x は point_2d とpoint_3d のどちらにも適用できる(
>>911 )
そして SML# だと、point_2d と point_3d のそれぞれの型について、
{X: real, Y:real} >= {X: real, Y:real, Z: real} という部分型関係を持ち、
ここで 関係 a >= b は「a の部分型が b である」ことを意味する
次に:
>構造的部分型関係を持つレコード型に類する型を持つのは OCaml や Java
>いわゆるオブジェクト指向におけるクラスとそれらの間の継承関係のこと
この文章は完全な間違いで、正しくは
「「非構造的」部分型関係を持つレコード型に類する型を持つのは OCaml や Java (...後略)」になる
たとえば(架空言語で)二次元座標上の点として 抽象クラス {} を定義し、その具象クラスとして
{X軸: real, Y軸: real} および(原点からの相対的な) {角度: real, 距離: real} を定義できる
ここで、2つの具象クラスのフィールド構成(=内部的構造)は全く異なるけれど、
{} >= {X軸: real, Y軸: real} および {} >= {角度: real, 距離: real} という部分型関係を持つ
『関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間』
http://www.amazon.co.jp/dp/4798043761/ なんか面白そう。
ベストセラー1位だし。
これあわせで、qiitaで何ヶ月か前に宣伝始めたんだよな。 今回のMSの開発者向けイベントで、マルチプラットフォームアピールしてたから、F#にもチャンスが増えるかも。
ML系でマルチスレッドプログラミングってどうやるの? できれば、プリエンプティブで。 ノンプリなら、バインディングさえ準備できればpthreadとか使うだけで出来る? あと、マルチコアで動く処理系ってどんなのがありますか?
ノンプリエンプティブな並行のフレームワークとしてはConcurrent ML、 マルチコアでプリエンプティブで動く処理系は…MultiMLton?使ったことないけど
SML/NJにCMLが入ってるみたいだけど 呼び出しかた自体が良く分かりませんでした,,,
まだバイトコードだけなんで処理速度的にはメリット薄いがocaml-multicoreも開発中
https://github.com/ocamllabs/ocaml-multicore 諦めてF#が一番楽そう
新潮10月号(9/7発売)に最新長編『モナドの領域』330枚一挙掲載
Haskell ガチムチいい男 F# タマもサオも取ったニューハーフ OCaml タマは摘出、サオは残したオカマ Java ノン気の一般人 C 古風な一般人 C++ 団塊の世代の一般人 C# ゆとり世代
Ocamlってschemeのvaluesに相当するのないのですか?
+ と+. って絶対に区別しないといけないのです?浮動小数と整数でコードわけるのめんどくさい
min-camlを読み解こうと思ってできれば小さく分けてコンパイルして確かめたいです parser.mly/lexer.mll/id.ml/syntax.ml/type.ml ここまでが最初の塊のようなのでocamlyacc/ocamllexしたあとインタプリタで #use "type.ml" #use "id.ml" #use "syntax.ml" #use "parser.ml" #use "lexer.ml" までやるとlexer.mlを読み込んでいるのにlexer.mllでエラーがでます どうやってインタプリタに読み込めばいいのでしょうか
C++11とboostでmlと等価なこと出来るようになってない?
OCaml覚えてHaxeのターゲット自分で書けるようになったらなあって思ったけど パット見何が書いてあるのか良くわからない
OCaml インストールしてたら が出てきた。 絵文字がこんなところにも進出してるとは……
OCamlには関数合成がないと訊くんですが、@@は合成ではないのですか
OCaml勉強しはじめの初心者の質問なんですが、どなたか教えてください
https://ocaml.org/learn/tutorials/modules.ja.html ここの説明によると、行末の;;を避けるためみんなこう書く
open Amodule
let () = hello ()
ってあるんですが、これがまず理解できない
()ってunitの定数値というかリテラルみたいなものなのではないですか?
letで束縛する的なコードが書けることが腑に落ちないのですが・・・
() って C の void みたいなもんやろ。 hello() の戻り値が void で両辺 void = void で OK みたいな。
=が等号ならそんな感じってするのですが、 let 変数名 = 値 って形に当てはまると unitの()って変数名であり値でもあるってこと? とか考え出すと混乱してしまいます・・・
>>937 その用途の場合単なるエントリポイントなので()にそんなに意味はない。
let _ =〜でも動作するよ。
>>939 letは代入ではなくパターンマッチ
普段は let パターン = 式 のパターンのところに新規の束縛(変数名)を一個置いてるだけ
let 1 =2 とか書けてMatch_failureになるよ
皆さんありがとう、何となく分かりました 実際に「let x::xs = [1;2;3;4];;」とかやるとx=1、xs=[2;3;4]とかなりますね letってのはmatchの単独パターンバージョンみたいな感じなんですね、きっと
たびたび初心者的質問ですいません OCamlにはListやArrayに対するgroup by関数って無いんでしょうか? 標準ライブラリ(ideoneやyukicoderで利用可能)の範囲内で存在すれば嬉しいんですが・・・
List.filter : ('a -> bool) -> 'a list -> 'a list ならある。 Arrayにはないから自力で実装するかExtLibでも使おう。 っていうか標準ライブラリだったら自分で検索しようね。 馬鹿なの?
>>945 標準ライブラリは探したけど、無かったから自作したよ
最近だとF#にしろscalaにしろgroupbyがあるのが当たり前だから、確認のため聞いてみた
その程度の事情も察せないお前が馬鹿じゃねw
宿題や競プロでもやるんじゃなきゃCoreかBatteries入れないとやってられない
map reduceに相当するもんがあればいけるんじゃね
「プログラミングの基礎」を買ってきてOcamlを始めようとしたのですがインタプリタが日本語を表示してくれません。ぐぐっても知識が足らず解決法がわからなくて途方に暮れています。誰か助けて…
どのようにして解決したのか書いてもらえると 同じ状況に陥った人の助けになるかも知れないわけだが…
>>953 解決策を2つ試しました まず、著者のサポートサイト(http://pllab.is.ocha.ac.jp/ ~asai/book/Linux.html)を見て、 @端末起動→上部メニューバーの端末タブ→文字コードの設定→日本語(EUC-JP)に設定してから ALANG=en_US.ISO88591 ocamlを実行しましたが解決しませんでした。 次に、http://qiita.com/KenjiYamauchi/items/40aaab56b65777950877 を参考にして、 @任意テキストエディタで~/(ホームディレクトリ配下の意味)に.ocamlinitというファイルを作り、 A「let printer ppf = Format.fprintf ppf "\"%s\"";; #install_printer printer」と記述した所、解決しました。 コンピュータやプログラミングに詳しい方にはかなりくどいと思いますが、多分自分のようなプログラミング初心者が読む本だと思うので念入りに書いておきます。 純粋関数型データ構造が発売されたってのに盛り上がってないな
>>957 あれを読むような層は、既に原書で読んでるから気にもしないのでは。
Real World OCaml で OCaml入門中です。
https://realworldocaml.org/v1/en/html/variables-and-functions.html ... As a result, when passing labeled functions as arguments,
you need to take care to be consistent in your ordering of labeled arguments.
要は、ラベル付引数持ちの関数 は 引数の順序気にしなくて良くなるので便利だねって話だったのに、
そういう関数を 他の関数に引数として渡す時は 順序気にしないと型エラーになるかもよ、と。
現 (OCaml ver. 4.04.1) にそうなってるのはしょうがないとして、ユーザーは不満だったりしないんですかね?
仕様変えてどこでも順序気にしなくてよくなるようにするのは何か不都合があるんでしょうか?
>>957 書店で立ち読みしてみたんだけど微妙に扱っているデータ構造少なくね?
サンプルコードがStandard MLというのは驚いたが。
「なんでも再帰」や「なんでも継続」を読んでみたら?例はSchemeだが
fact 0 = 1 fact n = n * (fact (n-1)) だと,fact (n-1)の再帰呼出の後で nとの掛け算を しなければならない.計算の最後(=末尾)が再帰では なく乗算となる. fact2 0 n = n fact2 n k = fact2 (n-1) (n*x) として fact1 n = fact2 n 1 としておけば,fact2の計算の最後はfact2の 再帰呼出で,callをgotoに変えたループで実行できる. こんな感じでイメージできる?
f_outer(n){ f_inner(n, accumulator){ if 1 == n accumulator else f_inner(n - 1, n * accumulator) } } accumulator に蓄積すれば?
f_outer(n){ f_inner(n, accumulator){ if 1 == n accumulator else f_inner(n - 1, n * accumulator) } return f_inner(n, 0) } 修正。 内部関数を、return するのが抜けていた
おおおわかった気がする ありがとう! なんでも再起とやらも読んで見ることにする
>>966 return f_inner(n, 1)
じゃない?
OcamlとかCoqって名古屋以外でも大学での授業とか研究に使われているの? 一時期のブームは去ったみたいだけど。 大学の情報学部とかの現状にはちょっとだけ興味がある。 そして流行に後れて今頃勉強している40代のオレ。
授業で使ったのに広まらなかったということか。 つまり啓蒙に失敗したと。
>971 広まらなかったというかキラーアプリがなかったというか… 結局Ocamlで作られたアプリで唯一プログラマ間で流行ったのがCoqなんじゃね?
OCaml は金融とかで使われてるんじゃ無かったか。 そういや Rust も最初は OCaml でコンパイラー書かれてたんだよな。
俺がocaml覚えたきっかけはとあるエロゲーのチートツールなんだが あれの作者がなぜそれを採用したかにはずごい興味ある
>>975 どっかの学生だったんじゃないの?兄妹ものエロゲだけに京大とか。
8月はちょっと纏まった時間がとれたので、 「ソフトウェアの基礎」日本語訳の練習問題を解きすすめてみた。 まだPoly.vが終わった序盤だけどだいぶCoqに慣れてきた。 星三つrecommendedでもたまに難しい問題があるなー、というのが感想。 論理学の命題というのは高校・大学教育で慣れているだけで 見直してみると思ったよりも複雑な構造をしていたのだと今更ながらに感じた。 実務でCoqが要求されることは当分ないと思うけど、 逆変換の関数は少なからず実装することがあるので ときどき「Coq使って証明したい」という気分にはなるんだよなー。
http://ocaml.jp/ 死んでるな……
> ( ! ) Parse error: syntax error, unexpected 'new' (T_NEW) in /virtual/osiire/public_html/lib/func.php on line 531
復活したのは良いけど、一言何か無いのかよ。誰が管理してるんだ。
日本語訳の古さに苦戦しつつLogic.vまで進めていたところ…… 久しぶりに英語の本家を見たら、 なんかVol.1 〜 Vol.3に増えてるー!? あまりの道のりの遠さに絶望しつつ内容を見ると、 旧版からホーア理論まわりをVol..2に分離し、 Vol.3は赤黒木等の少し高度なデータ構造について色々とCoqで証明して感じらしい(新規)。 ……く、面白そうじゃないか。
ここ一ヶ月、旧くなった日本語版を捨て英語版に再挑戦してみた。 以前は出来るだけ写経していたが時間がかかり過ぎるので、 付属の.vファイルを直接書き換える方針に変更。 結構章立てと共に内容変わってるなぁ……追加された良問も多いし。 英語の非形式的証明は書く機会もなさそうだし、パスするか。 しかし、答えがWeb上に転がってないのは自習者には正直辛い。 どうもSICPみたいな標準教科書を目指してるっぽい? こーゆうの(coq)を国立研究所で作れる国はやっぱり凄いと思う今日この頃。
read.cgi ver 07.7.25 2025/07/21 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20251005044843caこのスレへの固定リンク: http://5chb.net/r/tech/1245017721/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「関数型言語ML (SML, OCaml, etc.), Part 6->画像>1枚 」 を見た人も見ています:・佐藤超関数の物理学への応用 ・一般的な処理を関数型の書き方をすると遅い ・OOPの前に関数型やった方がよくない? ・C言語で関数を書いていくスレ ・関数型プログラミング言語Haskell Part32 ・プログラミングで、変数や関数の名前を英語で書く理由って何?日本語で書いた方がわかりやすいだろ。 ・なあ、再帰関数好きな人いる? パート3 ・【Cは】毛の壁ファンクラブ65【関数型】 ・【正論】『三角関数をみんなが学ぶ』←ぶっちゃけこれ必要ないよな ・【関数】Erlang Part 2【エリクソン】 ・最長不倒関数■C言語でmain関数に全コードを入れる ・Excel ピボット Power Pivot DAX関数 質問スレ ・【教育】三角関数「生きるのに必要ない」「絶対いる」で議論沸騰。橋下徹氏の『死に知識』発言をきっかけに★10 ・【教育】三角関数「生きるのに必要ない」「絶対いる」で議論沸騰。橋下徹氏の『死に知識』発言をきっかけに★5 ・VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】 ・関数型プログラミング言語Haskell Part34 (694) ・次世代言語27 Nim Zig Pony Carbon Gleam (308) ・【.NET】F#について語れ2【OCAML】 ・【.NET】F#について語れ3【OCAML】 (249) ・日本語プログラミング言語Mind ・【LAA】Los Angeles Angels part81 【ワッチョイ無】 ・YAMLでif文とfor文を使えるように拡張したで(ドヤァ ・設計思想/ソフトウェア工学(UML, デザパタetc) ・WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part21 ・WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part22 ・WPF(XAML, XBAP, .NET4.0)GUIプログラミング Part19 ・Xamarin Part4 ・Scratchはいいぞ ・Xamarin Part6 ・Xamarin Part5 ・programmer's cafe ・Google Colaboratory ・大黒天物産(ディオ&ラムー)12期目 ・【JKT48】TeamT & Trainee応援スレ ・Google App Engine for java ・C++/TemplateMetaProgramming ・How to do Math in programming ・Borland C++ Compiler オ ワ タ ・Google NaCl プログラミング 2mol ・ノーコードについて語るスレ【bubble】 ・TypeScript(MS) VS Swift(Apple) ・AtCoderとかしてる奴は自分で問題を作れない未熟者 ・ZennとかいうGoogleアカウントじゃないと ・小学生だけどScratchでごくまれに呟くBOT作る! ・【Scratch】メイクロックマン パート1 ・Microsoft Xamarin part8 [.NET MAUI] ・Microsoft .NET MAUI part9 [Xamarin] ・Microsoft .NET MAUI part10 [Xamarin] ・BITCOIN ビットマイニング始めました BTC ・Amebaブログみたいなブログサイトが作りたい ・【Electron】ハイブリッドアプリ開発総合【Cordova】 ・クラウドネイティブ言語 Ballerina part1 ・[akamai] LinuxがMSに便利に利用されてる件について ・【Erlang】プログラム言語 Elixir 【BEAM】 ・【QBASIC互換】FreeBASIC Part.2【Compiler】 ・【宇宙人狼】Among Us配信者実況スレ Part.48 ・Gboard - Google製多言語キーボード、文字入力 1 ・【MACRO】Google Apps Script 質問スレ【DRIVE】 ・【iPhoneも】Titanium Mobileスレッド【Androidも】 ・Bitcoin ビットコイン BTCをJPY 日本円に換金する方法 ・【Java】 Java Web Application Framework 総合 ・【MT5/MT4】 EA研究開発 Q&A 1 【売買自動】 ・【BTC】ビットコイン情報交換スレッド1055[アフィ転載禁止]
11:02:00 up 4 days, 11:15, 3 users, load average: 35.48, 48.49, 53.77
in 0.095644950866699 sec
@[email protected] on 102200