関数型言語ML (SML, OCaml, etc.), Part 6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/15(月) 07:15:21MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
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/
0086デフォルトの名無しさん
2009/06/29(月) 22:17:230087デフォルトの名無しさん
2009/06/29(月) 22:17:580088デフォルトの名無しさん
2009/06/29(月) 22:18:10>>86
うん。わかってはいるんだ。あんな書き込みをしてしまってごめんとしかいいようがない。
0089デフォルトの名無しさん
2009/06/29(月) 22:29:170090デフォルトの名無しさん
2009/06/29(月) 23:16:11(いまさらだが)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が必要なんだと思われる。
英語は雰囲気で読んでいるので間違っていたら誰かやさしく叱ってくれ。
0091デフォルトの名無しさん
2009/06/29(月) 23:40:30> あれぇ?書き込めた。どうせアク禁の巻き添えで書き込めないだろうと
> 勉強不足を棚に上げた愚痴>>83を書いてみたら・・・。
この精神でビルドがんばれ。
どうせビルドできないと思ってもできるかも。
0092デフォルトの名無しさん
2009/06/30(火) 00:26:310093デフォルトの名無しさん
2009/06/30(火) 03:36:38そんなこと言ってるから関数型はいつまでたってもドマイナーなんだよ
0094デフォルトの名無しさん
2009/06/30(火) 04:59:310095デフォルトの名無しさん
2009/06/30(火) 12:32:440096デフォルトの名無しさん
2009/06/30(火) 12:45:460097デフォルトの名無しさん
2009/06/30(火) 12:50:27それは、ずいぶん、どい なか です ね
0098デフォルトの名無しさん
2009/06/30(火) 13:13:58009982
2009/06/30(火) 17:56:45結局Cygwinなんか入れるよりもお勉強用のLinuxマシンを用意した方が早そうですね。
レス頂いてありがとうございます。
0100デフォルトの名無しさん
2009/06/30(火) 18:50:55完全にスレチだが、別にマシンを用意しなくても仮想環境を使えば楽なのに。
010182
2009/06/30(火) 18:57:35Knopixとかならできるのかな?
0102デフォルトの名無しさん
2009/06/30(火) 23:12:27virtual boxでdebianがおすすめです。
かなり低スペックでも動いて、何よりaptーgetでocamlも含め、たいていのライブラリが簡単にインストール出来ます。
0103デフォルトの名無しさん
2009/07/01(水) 00:05:15@を使わずにquick_sortを書き換えよ
ヒント:引数を一つ増やして整列済みのリストを受け取る
ってやつが解けまへん。。
教えて、偉い人
0104デフォルトの名無しさん
2009/07/01(水) 01:27:12まじっすかー!ありがとうございます。
今Ubuntuのデュアルブート環境作成厨…orz
ウブンツ重かったらそちらを試してみます。
0105デフォルトの名無しさん
2009/07/01(水) 01:35:56本読んでないけど末尾再帰じゃないすかね。
0106デフォルトの名無しさん
2009/07/01(水) 08:39:57apt getはububtuもdebianもほぼ同じなので、ububtuでも大丈夫ですよ。
0107デフォルトの名無しさん
2009/07/01(水) 16:48:02Windows上では動かないん?会社がWindowsだから・・・。
動くなら今すぐそっちの環境に移行したい。
0108デフォルトの名無しさん
2009/07/01(水) 16:55:45当然動く訳無い。
大体Linux上で生成されるオブジェクトファイルはELFフォーマットだし。
0109デフォルトの名無しさん
2009/07/01(水) 21:24:540110デフォルトの名無しさん
2009/07/02(木) 09:07:04憶測で物を言うな。吐かない。終わり。
0111デフォルトの名無しさん
2009/07/02(木) 09:15:480112デフォルトの名無しさん
2009/07/02(木) 12:14:41終わったところすまないが、>>109は吐ける!と断定しているわけではないから
もう少し生暖かくてもいいと思うんだ。
0113デフォルトの名無しさん
2009/07/02(木) 12:49:21>>110はいい加減なこと言う奴にうんざりしてるんだろうな。
この板はそんな奴ばかりだから、せめてソースくらい示さないと。
0114デフォルトの名無しさん
2009/07/03(金) 05:15:370115デフォルトの名無しさん
2009/07/03(金) 08:55:56しーっ!そういうこと言うと
憶測で(ry
とか言われちゃう
0116デフォルトの名無しさん
2009/07/03(金) 12:38:28「書き換えよ」とか「引数を一つ増やして」といわれても元々のコードがないと
答えられないぜよ。
0117デフォルトの名無しさん
2009/07/03(金) 17:08:590118デフォルトの名無しさん
2009/07/03(金) 18:05:20そういえばOcaml-nagoyaの連中(有限会社ITプランニング)ってどうなったの?
なんか公式サイトにつながらないんだけど。
0119デフォルトの名無しさん
2009/07/03(金) 19:23:03SMLのコードを移植していてはまった
0120デフォルトの名無しさん
2009/07/04(土) 11:16:05練習でちょっとしたものを作ろうとしたけど、ライブラリの少なさでたちまち不便で止まってしまった。
0121デフォルトの名無しさん
2009/07/04(土) 11:52:020122デフォルトの名無しさん
2009/07/04(土) 12:10:390123デフォルトの名無しさん
2009/07/04(土) 12:19:32HaskellならMonad IOがスタンダードだが、OCamlにはないからね。
IOはどうしても副作用になってしまう。
0124デフォルトの名無しさん
2009/07/04(土) 12:32:250125デフォルトの名無しさん
2009/07/04(土) 13:37:39どんなライブラリが欲しかったのん?
0126デフォルトの名無しさん
2009/07/04(土) 13:58:47憶測(ry
じゃなくて、本が違う。
ITplan は知らんけど、一日ぐらいサイトが落ちてていいだろ。週末だし。
0127デフォルトの名無しさん
2009/07/04(土) 14:19:25どうでも良いけど、365日接続できないサイト運営してる時点で技術力を疑う。
0128デフォルトの名無しさん
2009/07/04(土) 14:34:190129ogasawara
2009/07/04(土) 17:30:22恐縮です。うちが契約してるデータセンター屋さんの電源障害だそうで、何ともならなくて。
そろそろ復活するらしいのですが、うーん。
0130ogasawara
2009/07/05(日) 09:28:07The Caml Hump(http://caml.inria.fr//cgi-bin/hump.en.cgi)という
ところがあって、ここでライブラリを探すとかなり見付かりますよ。
CGI、DB接続、GUI、UTF-8、アルゴリズム色々など有ます。
0131デフォルトの名無しさん
2009/07/05(日) 15:57:43これは文法の慣習みたいなものかなと思うんですがどうなのかなぁと。
リストを受け取って何かを返す関数の場合、リストの要素が組やレコードだと
match文の中にmatch文を書くことがありますが、match文ではなく直接パターンマッチさせる書き方の方が
良いのでしょうか?
>>83
vmwareを使ってxp上でubuntuを動かして、ocaml勉強してます。
0132デフォルトの名無しさん
2009/07/05(日) 16:48:01質問をするときはサンプルコードを示したほうが回答してもらいやすいよ。
この文章だと
>match文ではなく直接パターンマッチさせる書き方の方が良いのでしょうか?
あたりがわかりづらいと思われ。
0133デフォルトの名無しさん
2009/07/05(日) 17:28:04kekkonっていう関数で、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 ->
0134デフォルトの名無しさん
2009/07/05(日) 17:44:47お好きな方を。ただ、
let rec kekkon anata = match anata with
は
let rec kekkon = function
の方が簡潔。
0135デフォルトの名無しさん
2009/07/05(日) 17:46:330136デフォルトの名無しさん
2009/07/05(日) 18:49:38このサンプルコードのようにレコードであれば直接アクセスするっていう手も
あるよ。タプルの場合は状況にもよるけど2番目の方法が多いんじゃないかな。
0137デフォルトの名無しさん
2009/07/06(月) 09:38:23pattern match でワザワザ意味不明な変数に束縛するスタイルはおかしい。
そんなことするから s が二回束縛されてるヨ。
136 の言うように r.name とかでアクセスするほうが普通。
0138デフォルトの名無しさん
2009/07/10(金) 16:02:51ttp://en.wikipedia.org/wiki/VList
のVlistというものを見つけたのですが、これはリストを使った
動的配列のようなものでしょうか。(英語が苦手のためよくわかりませんでした)
また、OCamlで書くとどのようになるのでしょうか。
分かる方がいたら教えてください。
0139デフォルトの名無しさん
2009/07/10(金) 20:09:46答えが欲しいの?それとも一緒に考えてほしいの?
Okasaki には載ってないね。
0140(* 〜 *)
2009/07/10(金) 22:04:04英語が読めなくても図は見えますよね。
構造はこんな感じでいいんじゃないの(図のまんま)。
type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a array
type 'a vlist = 'a vlisti * int
操作は自分で考えませう。
0141デフォルトの名無しさん
2009/07/10(金) 22:38:27ありがとうございます。コードのおかげでなんとなくですが
イメージできました。(とはいってもこのデータ構造が
どんな風にありがたいのかは、まだ理解できてはいないのですが・・・)
0142139
2009/07/11(土) 08:49:39type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a option array
のほうが良いです。
140 だと埋まって無いトコを埋める値が必要ですね。(Obj.magic 0 などで埋めるのはダメ絶対。)
0143デフォルトの名無しさん
2009/07/12(日) 20:12:390144143
2009/07/12(日) 20:52:010145デフォルトの名無しさん
2009/07/16(木) 08:02:09微妙にctagsとオプションが違ったりするのがウザかったんだ
0146デフォルトの名無しさん
2009/07/23(木) 08:24:190147デフォルトの名無しさん
2009/07/23(木) 09:00:30http://groups.google.com/group/fa.caml/browse_thread/thread/cc13807fa7204874/91529afa62a52640
0148デフォルトの名無しさん
2009/07/25(土) 19:43:01(('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
int -> int = <fun>
で型だけを指定して変数を宣言することはできますか?
0149デフォルトの名無しさん
2009/07/25(土) 23:52:22というか何がやりたいのか全くわからん
0150デフォルトの名無しさん
2009/07/26(日) 00:07:080151デフォルトの名無しさん
2009/07/26(日) 00:07:510152デフォルトの名無しさん
2009/07/26(日) 20:13:20fun (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は拘束されていないようですし。
0153148
2009/07/26(日) 21:13:50宣言できるということですよね?やりかたを教えていただけますか?
0155デフォルトの名無しさん
2009/07/26(日) 22:59:56ただ、関数の引数などにアノテーションすることで
関数の定義範囲を狭めることは出来る
普通の定義
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で制限したもの
0156デフォルトの名無しさん
2009/07/26(日) 23:00:460157デフォルトの名無しさん
2009/07/27(月) 10:29:45背景説明無しに、間違った用語で質問されても答えられません。
逆に説明があれば、多少間違っていても回答者の方で正しく解釈できます。
148 だけだとホントに意味不明だが 153 からすると、C における int x;
の様に「変数を宣言」できるか、というのが質問の意図だと思いますが、
ML では値の無い「識別子の束縛」は出来ません。
154、お前は未来に向けて話しているのか。
>>152
z:'a の z は識別子ではなくラベルです。後の z とは関係ありません。
文法をちゃんと確認して、ラベル付き引数の解説を読んでください。
0158デフォルトの名無しさん
2009/07/28(火) 12:36:020159デフォルトの名無しさん
2009/07/29(水) 00:57:410160デフォルトの名無しさん
2009/07/29(水) 13:23:33ありがとうございます。Yコンビネータのようなものを作ろうとしていました。
非常に参考になりました。
>>154が回答に感謝しているのは
>>150の、出来る、が回答になっていると思ったからなのですが。
0161デフォルトの名無しさん
2009/07/29(水) 21:32:04と
Yコンビネータを定義できる
は100光年くらい離れてる気がする
0162デフォルトの名無しさん
2009/08/15(土) 12:47:34(3///5) == [3;4;5] みたいな感じ。
演算記号は何が適当ですか?
0163デフォルトの名無しさん
2009/08/15(土) 15:34:300164デフォルトの名無しさん
2009/08/15(土) 17:40:51List.iter print_int (1--100)
とかですか? いいですね。見やすいです。
0165デフォルトの名無しさん
2009/08/22(土) 15:26:49OCamlの標準ライブラリに無いものは自分で実装しているのですが、SMLとの
コンパチを取るライブラリなどがあったりするのでしょうか?
0166165
2009/08/22(土) 22:50:51のことが出来るのですが、OCamlではUnixのmakeを使うのが普通なのでしょうか?
OCamlのドキュメントではmakeを使った例が書いてありました。
それとも、omakeというものがあるようですが、これを使うのが今時のやり方で
しょうか。
0167デフォルトの名無しさん
2009/08/22(土) 23:24:330168デフォルトの名無しさん
2009/08/23(日) 21:30:22http://www.inria.frは普通に繋がるだけに。
0169デフォルトの名無しさん
2009/08/24(月) 09:06:37OCaml の stdlib は「標準ライブラリ」にあらず、 OCaml 自身をコンパイル
するために最低限必要な関数を集めただけと考えたほうが幸せです。
「次世代」標準ライブラリ候補として Extlib, OCaml Batteries Included, Jane Street Core
などありますからそれのウチ好きなのを使ってください。(Batteries は Extlib を内包しているはず)
ビルドは make か OCaml 付属の ocamlbuild か omake か、別に何でも良いんじゃない?
- GNU make : どこにでもある。他でも使える。枯れてる。
- ocamlbuild : OCaml に付属。全く使えない。
- omake : 超強力、普通インストールされていない。強力過ぎて一線を超えた使いかたが難しい。
0170165
2009/08/24(月) 23:26:43ありがとうございます。
ExtLib, Batteriesの双方に同じ名前のモジュールが含まれていたので疑問に思って
いたのですが謎が解けました。SML Basis Libraryにあるような関数は、名前違いで
大体ExtLibでサポートされているようで安心しました。
ビルドツールはGNU makeを主に使ってきたのですが、omakeはファイル更新の
チェックが素晴らしいようなので、omakeを使ってみます。
0171デフォルトの名無しさん
2009/08/25(火) 11:41:33追加インストールとか面倒だし
0172デフォルトの名無しさん
2009/08/25(火) 12:34:520173デフォルトの名無しさん
2009/09/01(火) 14:33:390174デフォルトの名無しさん
2009/09/01(火) 20:45:28おもろかったけどgolfとかコンパイラ改造とかネタが裏街道過ぎて
実用志向のユーザー増えねえだろこれじゃ、とか思った
0175デフォルトの名無しさん
2009/09/01(火) 22:15:16Golfの話は意外と参考になった。演算子定義周りとか、普段あまり使わないから。
演算子によって優先順位が固定されているの勉強になった。
あとObj.magic。あれは反則技だろw
0176デフォルトの名無しさん
2009/09/07(月) 05:40:380177デフォルトの名無しさん
2009/09/09(水) 17:30:370178デフォルトの名無しさん
2009/09/09(水) 17:32:57$ ./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
・・・
0179デフォルトの名無しさん
2009/09/09(水) 18:09:02OCaml の mingw のビルドを参考にしたら?
JoCaml には付いて無いけど OCaml の README.win32 に書いてある。
0180デフォルトの名無しさん
2009/09/09(水) 20:36:00ありがとうございます。
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が入っていないようですが、これは不具合ということでよろしいでしょうか。
0181デフォルトの名無しさん
2009/09/09(水) 21:23:000182179
2009/09/09(水) 21:31:19同じバージョンの OCaml から引っ張って来たら運が良かったらビルドできるかも知れないが、
こんなトコで聞くくらいだったら JoCaml の人に win32.c 無いって聞く方がいいんじゃない?
0184デフォルトの名無しさん
2009/09/09(水) 22:30:08それで動く保証はないけど
0185デフォルトの名無しさん
2009/09/09(水) 22:31:050186デフォルトの名無しさん
2009/09/09(水) 22:34:59あ、Makefile.mingwでやりました。
上のはコピペで修正し忘れていました。
■ このスレッドは過去ログ倉庫に格納されています