X



関数型言語ML (SML, OCaml, etc.), Part 6

■ このスレッドは過去ログ倉庫に格納されています
2009/06/15(月) 07:15:21
関数型言語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/
2009/07/01(水) 16:55:45
>>107
当然動く訳無い。
大体Linux上で生成されるオブジェクトファイルはELFフォーマットだし。
2009/07/01(水) 21:24:54
OCamlってLLVMのコード吐けるんじゃなかったっけ
2009/07/02(木) 09:07:04
>>109
憶測で物を言うな。吐かない。終わり。

2009/07/02(木) 09:15:48
LLVMのocamlバインディングはある。という話と取り違えたのかな。
2009/07/02(木) 12:14:41
>>110
終わったところすまないが、>>109は吐ける!と断定しているわけではないから
もう少し生暖かくてもいいと思うんだ。
2009/07/02(木) 12:49:21
>>112
>>110はいい加減なこと言う奴にうんざりしてるんだろうな。
この板はそんな奴ばかりだから、せめてソースくらい示さないと。
2009/07/03(金) 05:15:37
LLVMのコード吐けるようにしようぜ、という話だけなら有った気がするが
2009/07/03(金) 08:55:56
>>114
しーっ!そういうこと言うと
憶測で(ry
とか言われちゃう
2009/07/03(金) 12:38:28
>>103
「書き換えよ」とか「引数を一つ増やして」といわれても元々のコードがないと
答えられないぜよ。
2009/07/03(金) 17:08:59
偉い人は プログラミング in OCaml を買ってないので答えられないのではないか。
2009/07/03(金) 18:05:20
>>117
そういえばOcaml-nagoyaの連中(有限会社ITプランニング)ってどうなったの?
なんか公式サイトにつながらないんだけど。
2009/07/03(金) 19:23:03
OCamlは大文字で始まるidはconstructor扱いになるんだな
SMLのコードを移植していてはまった
2009/07/04(土) 11:16:05
ocaml触ってみたんだけど、やっぱりライブラリが少ないね。
練習でちょっとしたものを作ろうとしたけど、ライブラリの少なさでたちまち不便で止まってしまった。
2009/07/04(土) 11:52:02
そんなに副作用たっぷりのコードを書きたいならF#でも使えばいいのに
2009/07/04(土) 12:10:39
副作用の無いライブラリを作るのは難しいの?
2009/07/04(土) 12:19:32
>>122
HaskellならMonad IOがスタンダードだが、OCamlにはないからね。
IOはどうしても副作用になってしまう。
2009/07/04(土) 12:32:25
それでF#でも使えと言われると辛いね…
2009/07/04(土) 13:37:39
>>120
どんなライブラリが欲しかったのん?
2009/07/04(土) 13:58:47
>>118
憶測(ry
じゃなくて、本が違う。
ITplan は知らんけど、一日ぐらいサイトが落ちてていいだろ。週末だし。
2009/07/04(土) 14:19:25
>>126
どうでも良いけど、365日接続できないサイト運営してる時点で技術力を疑う。
2009/07/04(土) 14:34:19
休日にメンテなら仕方ないけど、平日の夕方に落ちてるのは問題だな。
129ogasawara
垢版 |
2009/07/04(土) 17:30:22
>>118,126,127,128
恐縮です。うちが契約してるデータセンター屋さんの電源障害だそうで、何ともならなくて。
そろそろ復活するらしいのですが、うーん。
130ogasawara
垢版 |
2009/07/05(日) 09:28:07
>>120
The Caml Hump(http://caml.inria.fr//cgi-bin/hump.en.cgi)という
ところがあって、ここでライブラリを探すとかなり見付かりますよ。
CGI、DB接続、GUI、UTF-8、アルゴリズム色々など有ます。
2009/07/05(日) 15:57:43
質問です。match文に関する質問です。
これは文法の慣習みたいなものかなと思うんですがどうなのかなぁと。

リストを受け取って何かを返す関数の場合、リストの要素が組やレコードだと
match文の中にmatch文を書くことがありますが、match文ではなく直接パターンマッチさせる書き方の方が
良いのでしょうか?

>>83
vmwareを使ってxp上でubuntuを動かして、ocaml勉強してます。
2009/07/05(日) 16:48:01
>>131
質問をするときはサンプルコードを示したほうが回答してもらいやすいよ。
この文章だと
>match文ではなく直接パターンマッチさせる書き方の方が良いのでしょうか?
あたりがわかりづらいと思われ。
2009/07/05(日) 17:28:04
>>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 ->

2009/07/05(日) 17:44:47
>>133
お好きな方を。ただ、
let rec kekkon anata = match anata with

let rec kekkon = function
の方が簡潔。
2009/07/05(日) 17:46:33
どっちでもいいんですね。どもです。
2009/07/05(日) 18:49:38
>>133
このサンプルコードのようにレコードであれば直接アクセスするっていう手も
あるよ。タプルの場合は状況にもよるけど2番目の方法が多いんじゃないかな。
2009/07/06(月) 09:38:23
record label に折角意味のある名前を付けてあるのに、
pattern match でワザワザ意味不明な変数に束縛するスタイルはおかしい。
そんなことするから s が二回束縛されてるヨ。
136 の言うように r.name とかでアクセスするほうが普通。
2009/07/10(金) 16:02:51
データ構造について調べていたら
ttp://en.wikipedia.org/wiki/VList
のVlistというものを見つけたのですが、これはリストを使った
動的配列のようなものでしょうか。(英語が苦手のためよくわかりませんでした)
また、OCamlで書くとどのようになるのでしょうか。
分かる方がいたら教えてください。
2009/07/10(金) 20:09:46
まぁ、List.nth が妙に早い list と思えばいいね。
答えが欲しいの?それとも一緒に考えてほしいの?
Okasaki には載ってないね。

140(* 〜 *)
垢版 |
2009/07/10(金) 22:04:04
長さが倍になっていくarrayが中身のリンクリストにしか見えないんですけど。
英語が読めなくても図は見えますよね。
構造はこんな感じでいいんじゃないの(図のまんま)。

type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a array
type 'a vlist = 'a vlisti * int

操作は自分で考えませう。
2009/07/10(金) 22:38:27
>>140
ありがとうございます。コードのおかげでなんとなくですが
イメージできました。(とはいってもこのデータ構造が
どんな風にありがたいのかは、まだ理解できてはいないのですが・・・)
142139
垢版 |
2009/07/11(土) 08:49:39
教育上は
type 'a vlisti = VLNil | VLCel of 'a vlisti * int * 'a option array
のほうが良いです。
140 だと埋まって無いトコを埋める値が必要ですね。(Obj.magic 0 などで埋めるのはダメ絶対。)


2009/07/12(日) 20:12:39
ctags5.8でOCamlがサポートされたらしいよ。
144143
垢版 |
2009/07/12(日) 20:52:01
ctags -> Exuberant Ctagsに訂正。
2009/07/16(木) 08:02:09
otagsがいらなくなると嬉しいな
微妙にctagsとオプションが違ったりするのがウザかったんだ
146デフォルトの名無しさん
垢版 |
2009/07/23(木) 08:24:19
OCamlからCへのトランスレーターってありませんか?
2009/07/23(木) 09:00:30
>>146
http://groups.google.com/group/fa.caml/browse_thread/thread/cc13807fa7204874/91529afa62a52640
148デフォルトの名無しさん
垢版 |
2009/07/25(土) 19:43:01
OCamlで
(('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
int -> int = <fun>

で型だけを指定して変数を宣言することはできますか?
2009/07/25(土) 23:52:22
変数何それ怖い

というか何がやりたいのか全くわからん
2009/07/26(日) 00:07:08
>>148の型を持つ識別子なら定義出来る
2009/07/26(日) 00:07:51
ただ、上は-rectypesなしで出来るかはわからん
2009/07/26(日) 20:13:20
型注釈を使った無名関数をかいていて、ふと閃いて

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は拘束されていないようですし。

153148
垢版 |
2009/07/26(日) 21:13:50
それはxという識別子をxはintである、ということだけ指定して
宣言できるということですよね?やりかたを教えていただけますか?
154148/153
垢版 |
2009/07/26(日) 21:15:14
>>148

>>149
>>150
様あてです。失礼しました。それと回答ありがとうございます。
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で制限したもの
2009/07/26(日) 23:00:46
int->intじゃなくて'a->'bだった
2009/07/27(月) 10:29:45
質問者はもう少し動機などを書き加えてほしい。推敲した上で。
背景説明無しに、間違った用語で質問されても答えられません。
逆に説明があれば、多少間違っていても回答者の方で正しく解釈できます。

148 だけだとホントに意味不明だが 153 からすると、C における int x;
の様に「変数を宣言」できるか、というのが質問の意図だと思いますが、
ML では値の無い「識別子の束縛」は出来ません。

154、お前は未来に向けて話しているのか。

>>152
z:'a の z は識別子ではなくラベルです。後の z とは関係ありません。
文法をちゃんと確認して、ラベル付き引数の解説を読んでください。
2009/07/28(火) 12:36:02
切口上的に始まる親切なレス乙!
2009/07/29(水) 00:57:41
val come_on : orz -> or2
160デフォルトの名無しさん
垢版 |
2009/07/29(水) 13:23:33
>>159
ありがとうございます。Yコンビネータのようなものを作ろうとしていました。
非常に参考になりました。 

>>154が回答に感謝しているのは
>>150の、出来る、が回答になっていると思ったからなのですが。
2009/07/29(水) 21:32:04
(('a -> 'b) -> 'a -> 'b) -> 'a -> 'bという型の識別子を定義できる



Yコンビネータを定義できる

は100光年くらい離れてる気がする
162デフォルトの名無しさん
垢版 |
2009/08/15(土) 12:47:34
(///)のような演算子をつくってhaskellのようなリスとりてらるを部分的に実現したいです。
(3///5) == [3;4;5] みたいな感じ。
演算記号は何が適当ですか?
2009/08/15(土) 15:34:30
( -- ) をどっかのサンプルコードで見たな
2009/08/15(土) 17:40:51
>>163
List.iter print_int (1--100)
とかですか? いいですね。見やすいです。
2009/08/22(土) 15:26:49
SML/NJから移ってきましたが、SMLとは色々と違う部分が多くて戸惑います。
OCamlの標準ライブラリに無いものは自分で実装しているのですが、SMLとの
コンパチを取るライブラリなどがあったりするのでしょうか?
166165
垢版 |
2009/08/22(土) 22:50:51
再度すいません。SML/NJにはCompilation Managerというものがあってmake相当
のことが出来るのですが、OCamlではUnixのmakeを使うのが普通なのでしょうか?
OCamlのドキュメントではmakeを使った例が書いてありました。
それとも、omakeというものがあるようですが、これを使うのが今時のやり方で
しょうか。
2009/08/22(土) 23:24:33
それはおまけ
2009/08/23(日) 21:30:22
なんかhttp://caml.inria.frが異様に重いんだけど、どうかしたのかな。
http://www.inria.frは普通に繋がるだけに。
2009/08/24(月) 09:06:37
SMLとのコンパチを取るライブラリなんていう後向きの物は聞いたことありません。
OCaml の stdlib は「標準ライブラリ」にあらず、 OCaml 自身をコンパイル
するために最低限必要な関数を集めただけと考えたほうが幸せです。
「次世代」標準ライブラリ候補として Extlib, OCaml Batteries Included, Jane Street Core
などありますからそれのウチ好きなのを使ってください。(Batteries は Extlib を内包しているはず)

ビルドは make か OCaml 付属の ocamlbuild か omake か、別に何でも良いんじゃない?
- GNU make : どこにでもある。他でも使える。枯れてる。
- ocamlbuild : OCaml に付属。全く使えない。
- omake : 超強力、普通インストールされていない。強力過ぎて一線を超えた使いかたが難しい。
170165
垢版 |
2009/08/24(月) 23:26:43
>>169
ありがとうございます。
ExtLib, Batteriesの双方に同じ名前のモジュールが含まれていたので疑問に思って
いたのですが謎が解けました。SML Basis Libraryにあるような関数は、名前違いで
大体ExtLibでサポートされているようで安心しました。

ビルドツールはGNU makeを主に使ってきたのですが、omakeはファイル更新の
チェックが素晴らしいようなので、omakeを使ってみます。
2009/08/25(火) 11:41:33
なんでもいいから早く標準に入れてくれ
追加インストールとか面倒だし
2009/08/25(火) 12:34:52
こんなとこで呟いても何も起こらんよ。
2009/09/01(火) 14:33:39
だれかOCaml Meetingいった?
2009/09/01(火) 20:45:28
いったよー

おもろかったけどgolfとかコンパイラ改造とかネタが裏街道過ぎて
実用志向のユーザー増えねえだろこれじゃ、とか思った
2009/09/01(火) 22:15:16
行かなかったが、ストリーミングでアメリカ人?の発表のところまで見た。
Golfの話は意外と参考になった。演算子定義周りとか、普段あまり使わないから。
演算子によって優先順位が固定されているの勉強になった。
あとObj.magic。あれは反則技だろw
2009/09/07(月) 05:40:38
OCamlが+-*/等の演算子をpolymorphicに出来ない理由って何?
2009/09/09(水) 17:30:37
jocamlをmingw上でコンパイルするにはどうすれば良いでしょうか。
2009/09/09(水) 17:32:57
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
・・・
2009/09/09(水) 18:09:02
多分 configure したのが間違い。
OCaml の mingw のビルドを参考にしたら?
JoCaml には付いて無いけど OCaml の README.win32 に書いてある。

2009/09/09(水) 20:36:00
>>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が入っていないようですが、これは不具合ということでよろしいでしょうか。
2009/09/09(水) 21:23:00
mingwなんだからMakefile.mingw使わなきゃならないと
182179
垢版 |
2009/09/09(水) 21:31:19
さーねぇ、俺は JoCaml 使ったこと無いからこれ以上は判らんね。
同じバージョンの OCaml から引っ張って来たら運が良かったらビルドできるかも知れないが、
こんなトコで聞くくらいだったら JoCaml の人に win32.c 無いって聞く方がいいんじゃない?
183179
垢版 |
2009/09/09(水) 21:45:10
>>181
ん?あ、確かに。リンクエラーも判らんし README も読めんのに挑戦かよ。

2009/09/09(水) 22:30:08
OCamlから足りないソース持ってこないといかんかもね
それで動く保証はないけど
185デフォルトの名無しさん
垢版 |
2009/09/09(水) 22:31:05
unix でやるのが早いでしょ。
2009/09/09(水) 22:34:59
>>181
あ、Makefile.mingwでやりました。
上のはコピペで修正し忘れていました。
2009/09/09(水) 22:36:17
>>185
JoCamlでアプリを書くつもりなので、Windowsでないとダメなんですよ。
188デフォルトの名無しさん
垢版 |
2009/09/09(水) 22:47:01
Luc でさえ、windows で試してないって言ってるし、
イバラの道じゃないかねー。Luc に聞かんと誰もわからんよ。
ちなみに win32.c は jocaml のレポから随分前に消えてる。
189デフォルトの名無しさん
垢版 |
2009/09/09(水) 22:49:38
http://jocaml.inria.fr/
We distribute JoCaml as sources. Those sources are for Unix systems
と書いてあるが、これは読んだのか?
2009/09/11(金) 20:25:19
Batteries Included のドキュメントみてたら
リスト内包標記とか where 節とか open Module in とかあってびびった
使ってる人いる?
191デフォルトの名無しさん
垢版 |
2009/09/12(土) 11:44:43
既存のp4拡張をいろいろ集めただけでしょ。
open in はオーバーヘッドを理解してれば使える。
2009/09/17(木) 12:29:49
オーバーヘッドあるんだ。
2009/09/17(木) 12:56:31
open M in e は
let module M' = struct open M let v = e end in v
に変換されるので、ブロックを一つ作る。
普通はたいしたこと無いが、再帰関数中で open M in するのは少し考え物だ。
2009/09/17(木) 13:09:21
すまん、let module M' = struct open M let v = e end in M'v の間違い

let rec f x = open M in e (* e 中に f の再帰呼出あり *)

とか書くと f の呼出しごとにブロックが出来て、時間とメモリを食う。
2009/09/17(木) 13:13:49
M'.v ですー。
2009/09/19(土) 14:39:44
時間とメモリを食うのはコンパイル時じゃないの?
197デフォルトの名無しさん
垢版 |
2009/09/21(月) 22:22:32
実行時にもオーバーヘッドがある。気になるならベンチ取ってね。
2009/10/18(日) 14:08:13
浅井さんの「プログラミングの基礎」のサポートページって消えてる?
2009/10/31(土) 11:31:30
birdの書いたsudokuの解放プログラム面白かった。
http://www.cs.tufts.edu/~nr/comp150fp/archive/richard-bird/sudoku.pdf
200デフォルトの名無しさん
垢版 |
2009/11/09(月) 04:34:20
Practical OCaml 買おうかと思ったのですが、評判悪いのが気になりました。
実際に読んだ方いましたら、感想を聞かせてください。
201デフォルトの名無しさん
垢版 |
2009/11/09(月) 23:09:48
> Practical OCaml 買おうかと思ったのですが、評判悪いのが気になりました。
> 実際に読んだ方いましたら、感想を聞かせてください。

たった今、ゴミだからいらないという人にもらいました。確かにゴミです。ネタとしてならどうぞ。
2009/11/10(火) 00:11:27
俺はocamllex ocamlyacc の簡単なチュートリアルが欲しくて買ったけど、
そこについては別にひどくは無かったと思ったよ。
203デフォルトの名無しさん
垢版 |
2009/11/10(火) 04:23:58
コードのインデントが至るところで狂っている時点でダメでしょう。
どのページを開いても何かツッコミどころがあるというある意味貴重な本。
値段も安くはないし絶対にお薦めしない。
204デフォルトの名無しさん
垢版 |
2009/11/10(火) 21:20:02
http://d.hatena.ne.jp/camlspotter/20091110/1257833616
http://rainyday.blog.so-net.ne.jp/2006-11-25
http://shuns.sakura.ne.jp/?%BD%B5%B5%AD%2F2006-4-

これ出た当時はオライリーのフランス語のやつ(当時すでに絶版)以外ではこれしか本がなかったけど
日本語書籍がいくつもある今買う価値はないと思いますね。
205デフォルトの名無しさん
垢版 |
2009/11/12(木) 00:57:52
SML#の大堀先生は、最近、何してるの?
継続してれば、有望だと思ったんだけどな・・・ > SML#
2009/11/14(土) 00:34:44
>>201
apressの書籍ってほとんどハズレだと思う
これもハズレだったよ
2009/11/14(土) 02:34:17
【科学】道路に軍手が落ちているワケ、名城大研究チームが突き止める[09/11/05]

http://namidame.2ch.net/test/read.cgi/hidari/1257990721/


■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況