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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
関数型言語MLについて語るスレッドです。

MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。

総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/

前スレ
関数型言語ML(SML, OCaml, etc.), Part 3
http://pc8.2ch.net/test/read.cgi/tech/1103606223/

過去ログ、関連リンクは>>2-4あたり
2デフォルトの名無しさん:2005/11/26(土) 20:09:31
3デフォルトの名無しさん:2005/11/26(土) 22:15:19
関連リンク!!!!!!!!!!!!!!!!!!!
4デフォルトの名無しさん:2005/11/27(日) 12:17:13
::::::::::::::        ::: レ'⌒ヽ     こいつはくせえッー!
ヽ-───i===i─-}ァ'  ノ    ゲロ以下のにおいが
、` ー-===-゚---゚==‐' / プンプンするぜッ─ッ!!
、`¨フ>;''ニニゞ,;アニニY´; )     こんなクソスレには出会ったことが
_、;;)¨´,ニ=゚='" ,.ヘ=゚:く {ッリ'        ねえほどなァ─ッ
i1(リ        r;:ドヽ K
ヾ=、     に二ニヽ `|; )
_,ノ| i.     {⌒゙'^ヽ.{  i;; ヽ
 _,ノ!i ヽ、  ヾ二ニソ ,';;;  ;;冫=:、
_;(|.!.  \   ‐っ /!;;; ;;/ 、''"\__  お前は生まれついてのヒキヲタだッ!
'ト、\.   ,ゝ、.二..イリ\ / ー1\'ニゝヽ_
:ヽ  `ニア   ,. -┴‐‐'  ー-:l :=ゞ=ソ」=ヽ   ム板の皆さん
:::::\ ニ=ト、.i___`ー-┴-、ノ .   l __l| ,ニト、くヽ
l::::::::::\ー:ト      __}/ト、゙ ー-‐| ,ニ|ゞ=ハ `¨´ー-  早えとこ
;ニ=ー:::::::ヾト、._    ̄ ノ|::ヽ ニ._‐-ゞ=' .ノ ::|::::::::::: 隔離しちまいな!
5デフォルトの名無しさん:2005/11/27(日) 15:34:26
このスレって結構いろいろな人が見ているのかな?
だったらお願いですけど、関数型言語を習熟している中の人たちは
もう少しWebアプリの方向に手を広げてくれないでしょうか?
多くの人たちが救われるのではないかと思います。
6デフォルトの名無しさん:2005/11/27(日) 16:46:29
寄付すれば多少良くなんじゃない
7デフォルトの名無しさん:2005/11/27(日) 18:01:58
手を広げるっていってもなぁ。
OCaml には ocamlnet や mod-caml、 as/xcaml なんかがあって、実際に運用
されているわけだがそれでは不満?

ライブラリが未整備ということなのか、(日本語の)ドキュメントが不足してるっ
てことなのか、webアプリケーションフレームワークが欲しいってことなのか。
それとも単に実例が見てみたいとかそういうこと?
8デフォルトの名無しさん:2005/11/27(日) 18:24:17
>>7
たぶん実例にそったプロジェクトXな話が聞きたいものと思われ。
9デフォルトの名無しさん:2005/11/27(日) 20:35:18
風邪の中の昴
10デフォルトの名無しさん:2005/11/27(日) 22:18:00
ocamlfind でビルドする系のパッケージが
軒並みビルドに失敗するんですけど・・・
ocamlfind 自体のインストールはうまくいってると思うんだけど
(ocamlfind --list とかはきちんと動いてるっぽい)
ocamlfind ocamlc -c ... -package ...
系の実行が全て失敗する

同じようなことでトラぶった人います?最悪Makefile手で書き換えるしか
ないんだろうか
11デフォルトの名無しさん:2005/11/27(日) 22:46:54
やっぱ Makefile で提供するのが一番。
12デフォルトの名無しさん:2005/11/27(日) 22:54:25
とはいえ、OCamlMake とかも ocamlfind を前提にするように
なっているしなぁ
でもこんなの使わないで素直に書いてもそんなに
大変じゃないのにね
13デフォルトの名無しさん:2005/11/28(月) 00:46:36
>10
トラブル起きたことないなぁ。 ocamlfind query とかの結果はどうなるの? 環境は?
list は上手く行くのに ocamlc -c すら失敗するというのは、 META ファイル
の内容がおかしいんじゃないの?
ひょっとして、たとえば camomile を使うのに pcre とか unix を -package で呼んでないとかいうオチはない?
依存関係とかは追ってくれないから自分で指定しないとダメだよ。これにやられたことはある。
14デフォルトの名無しさん:2005/11/29(火) 04:09:48
>>5
SML#
15デフォルトの名無しさん:2005/11/29(火) 08:55:10
Ocamlでは副作用が扱えるけれど
扱えない場合、たとえば Haskelとかではスレッド間の共有メモリを
どうやって実現するのだろうか
16デフォルトの名無しさん:2005/11/29(火) 10:36:28
Monadで
17デフォルトの名無しさん:2005/11/29(火) 14:19:20
とりあえず Haskell でわからん事があったら
訳もわからず Monad と言ってみるテスト
18デフォルトの名無しさん:2005/11/29(火) 22:22:23
haskellで単純にやるとモナド使っている間はずっとロックしっぱなしになりそうだな。
19デフォルトの名無しさん:2005/11/30(水) 10:04:25
F#になるけど、Chinese Chess というのが公開されてるよ

http://www.strangelights.com/fsharp/ChineseChess.aspx

.NET との連携を学ぶ良いサンプルだと思う
20デフォルトの名無しさん:2005/11/30(水) 13:03:24
>>15
Haskellとスレッドという概念がマッチしないような気がする。

スレッドプールから起動するHaskell Servletなんてのを想像しても
どういう実行モデルになるのかイメージすら湧かない。
21デフォルトの名無しさん:2005/11/30(水) 13:55:34
そりゃ発想が貧困なのでは……。

GHC にも Hugs にも普通に Concurrent っつーライブラリがあります。
並列計算を抽象化した STM モナドってのもあります。

また、最初から Concurrent を意識して設計された
Concurrent Clean っつー純粋関数型言語もあります。

つーかスレ違いです。
22デフォルトの名無しさん:2005/12/01(木) 07:22:51
Java(オブジェクト指向)があれば関数型言語なんてひつようないだろ?
23デフォルトの名無しさん:2005/12/01(木) 07:46:58
うん、そうだな。だからこんなスレにいないでJava(オブジェクト指向)スレに行こうぜ。
24デフォルトの名無しさん:2005/12/01(木) 07:51:36
いや、まよえる子羊たちを救わないと。
25デフォルトの名無しさん:2005/12/01(木) 16:52:31
迷える仔羊を Java へといざなうのでつね。

26デフォルトの名無しさん:2005/12/01(木) 19:39:29
>>22
おいおい、逆だろ・・・
27デフォルトの名無しさん:2005/12/01(木) 22:09:33
いってらっしゃ〜い。
28デフォルトの名無しさん:2005/12/02(金) 21:24:51
まあ、Java で一度痛い目見ないと、関数型言語のありがたみがわからないかも知れないしね。
29デフォルトの名無しさん:2005/12/03(土) 00:35:03
まあ、引きこもって妄想にふけってるうちは関数型言語で十分かもれないね。
現実をみつめないとJavaのすごさはわからないだろうねw
30デフォルトの名無しさん:2005/12/03(土) 01:07:00
>>29 「Javaのすごさ」ってのは、
言語でなく、ライブラリやフレームワークだからな…

あの資産を、MLから利用したい気はする

# MLj とかいわないでね
31デフォルトの名無しさん:2005/12/03(土) 03:05:39
現在のIT社会を支えるIT土方のみなさんに敬礼!
32デフォルトの名無しさん:2005/12/03(土) 10:55:53
どっかのLispの人は半月もすればLispの方に軍配があがるとか言ってるわけだが、
MLの人はへたればかりですか?
33デフォルトの名無しさん:2005/12/03(土) 11:40:20
Java 厨ってどこぞの一神教の信者と同じクオリティだよな。
神様なんざ、その時その時で都合の良いヤツを拝んどきゃ良いんであって、
何でもかんでも一つの神様で片付けようなんてナンセンスだってことに気付けよ。

コンピュータの世界ってのは日本と同じで八百万の神様の国なの。
全知全能の神なんてものは存在しない。
34デフォルトの名無しさん:2005/12/03(土) 12:44:49
複雑な言語仕様の場合は覚える数を減らした方がよい。
なぜなら、一つを習熟し品質を高めれば似たような事をする場合に
早く高品質の物を作れるからだ。

大規模で複雑なプログラムを作る場合にも複雑な言語仕様に似た特性がでてくる。
そのため、一つの言語でやることでメリットが発生する。
しかし…
35デフォルトの名無しさん:2005/12/03(土) 15:22:53
>>33 年取ってきて、宗教に関心がでてきた人ですか?
36デフォルトの名無しさん:2005/12/03(土) 15:27:53
ま、車にたとえるなら、

Java --- セルシオ
ML  ----- ミニ四駆w

ってかんじだよ、実際の話さ。
37デフォルトの名無しさん:2005/12/03(土) 15:40:26
使い分けなんて言ってないで全部(状況が許す限り)MLで書けば良いじゃん
MLってそれを指向した言語なんでしょ?
38デフォルトの名無しさん:2005/12/03(土) 16:38:17
一神教:バイナリな区別をする人
多神教:物の区別ができない人
39デフォルトの名無しさん:2005/12/03(土) 16:54:28
何この変な流れ
40デフォルトの名無しさん:2005/12/03(土) 20:46:48
しばらくすればまた元に戻るさ。
41デフォルトの名無しさん:2005/12/04(日) 00:53:50
MLが指向したのは定理証明系の構築だろ
42デフォルトの名無しさん:2005/12/04(日) 17:49:06
coq厨乙
43デフォルトの名無しさん:2005/12/04(日) 20:16:43
ISABEL厨乙
44デフォルトの名無しさん:2005/12/06(火) 18:00:01
OCamlでゲームでも作ろうと思って挫折した俺がきましたよ。
GUIライブラリくれとまではとか言わないけど、最低限Windowだすくらいまではなんとかならんものか。
SDL for OCamlはなんかインストール失敗したし。
45デフォルトの名無しさん:2005/12/06(火) 18:11:01
インストール失敗厨、世に蔓延る
46デフォルトの名無しさん:2005/12/06(火) 23:32:38
くりーんならかんたんにげーむがつくれるぞ
47デフォルトの名無しさん:2005/12/07(水) 01:09:53
JAVAなら、ややこしいところはぱぱっとつくれます。
本質的なところだけに集中できます。
48osiire:2005/12/07(水) 13:28:46
>>44
Window出すぐらいなら、なんとかなるぞ。ほんとにそれだけだけど。
ttp://www.h2.dion.ne.jp/~pana/downdown/downdown.html
49デフォルトの名無しさん:2005/12/07(水) 16:59:48
>>47
×JAVA
○Java
50デフォルトの名無しさん:2005/12/08(木) 20:12:43
型 推 論 や ら な い か
51デフォルトの名無しさん:2005/12/10(土) 03:11:33
widestudioのocamlバインディングって使える?
経験者談キボン
52デフォルトの名無しさん:2005/12/11(日) 13:07:58
age
53デフォルトの名無しさん:2005/12/14(水) 06:55:26
から揚げかよw
54デフォルトの名無しさん:2005/12/16(金) 09:45:15
private row って何が嬉しいの? どう使えば便利なの?
55デフォルトの名無しさん:2005/12/18(日) 23:22:59
HaMLetのwebページにあったSMLの構文拡張。俺的にはいい線いってる。
http://www.ps.uni-sb.de/hamlet/README-succ.txt

Successor ML とかいうSMLの拡張があるんだな。
56デフォルトの名無しさん:2005/12/23(金) 16:13:01
private row types を利用すれば、こういうコードで型を
ボトムアップ的に拡張していけるのは理解できました。

type basic = [`Bool of bool | `Int of int]

module Props(X : sig type t = private [> basic] end) =
struct
let to_string (v : X.t) = match v with
`Bool b -> if b then "true" else "false"
| `Int n -> string_of_int n
| _ -> "other"
end

type extended = [basic | `Float of float]

module MyProps = Props(struct type t = extended end)

let to_string (v : extended) = match v with
`Float f -> string_of_float f
| #basic -> MyProps.to_string v

ところで、この MyProps.to_string を"上書き"して、`Float を含む
to_string に置き換えらるとさらに嬉しいのですが、スマートな方法って
ありますでしょうか?
57デフォルトの名無しさん:2005/12/24(土) 16:10:52
ttp://jp.sun.com/communities/open/technology/01_language.html

> MLは利用が研究室や個人で閉じているためか、
> コミュニティの存在を確認することはできませんでした。
> 住井英二郎さんのMinCaml(美しい日本のMLコンパイラ)が公開されていますが、
> これについても同様です。
58デフォルトの名無しさん:2005/12/24(土) 19:20:27
コミュニティがあっても、
言語を使って作るものよりも言語そのものに興味のあるコミュニティじゃあね。
59デフォルトの名無しさん:2005/12/25(日) 12:03:26
>>57
ocam.jpは無視ですか。そうですか。
60デフォルトの名無しさん:2005/12/25(日) 12:07:24
よく読むとひでえ偏った糞文章だな。
61デフォルトの名無しさん:2005/12/25(日) 14:52:59
>>44

# #load "graphics.cma" ;;
# Graphics.open_graph "" ;;
- : unit = ()

ただの標準のOCamlでな。
62デフォルトの名無しさん:2005/12/25(日) 18:58:26
>59
l が抜けてるし。
63デフォルトの名無しさん:2005/12/31(土) 18:09:28
MLって正直、すごいよ。
64デフォルトの名無しさん:2005/12/31(土) 20:03:16
kwsk
65デフォルトの名無しさん:2006/01/04(水) 16:59:50
fun length [] = 0
| length (x::xs) = 1 + (length xs)
66デフォルトの名無しさん:2006/01/06(金) 17:04:56
ML全然詳しくないけど、Prologみたいですね。
67デフォルトの名無しさん:2006/01/07(土) 00:36:31
68デフォルトの名無しさん:2006/01/15(日) 13:01:53
http://www.cip.physik.uni-muenchen.de/~tf/raytracer/

このページで「Objective CamlとOCamlを比較してやるぜ」と、
レイトレーシング・プログラムで速度比較してるんですが、
正直なところそのふたつの言語の違いが分かりません。
OCamlってObjective Camlの略だと思っていたんですが・・・?
69デフォルトの名無しさん:2006/01/15(日) 20:48:19
MLで何をプログラミングしてもいいんだけど、計算機科学とか
プログラミング言語基礎論のような専門的話題について理解がないと
MLでなくとも出来ることに限られてくると思います。
また専門的話題をネットだけで勉強するのはやはり無理というか
限界があるのでは…。

「田舎の学問より京の昼寝」というか、やはり(英語の)成書や大学なり
(国際)学会なりで、ちゃんと見聞きするのに比べると…。
70デフォルトの名無しさん:2006/01/15(日) 21:09:05
>>69
誰に言ってるの?
71デフォルトの名無しさん:2006/01/16(月) 02:14:56
>69
学会論文も英語の良書もネット公開されてたりするし、
ネットだけでアカデミックな勉強をするのも可能だと思うよ。
学会参加による顔と顔をつきあわせた議論のようなものは難しいけど、
メールのやりとりだってできるし、なんとかなるんじゃない?
72デフォルトの名無しさん:2006/01/16(月) 11:28:10
大学なりで一度はちゃんと見聞きしてきた人なら
>>71みたいなことも出来ると思う。
73デフォルトの名無しさん:2006/01/16(月) 11:34:11
Windows版(MSVC)のOcamlで各種モジュール使うときに
# Unix.getcwd();;
Reference to undefined global `Unix'
とかって出ちゃって、
# #load "E:\\Program Files\\Objective Caml\\lib\\unix.cma";;
これを打っておくと使えるようになるんだけどこういうもんなの?
74デフォルトの名無しさん:2006/01/16(月) 12:08:21
もういっかい、大学入って勉強しなおしてみたいなぁ。とは思うなぁ
75デフォルトの名無しさん:2006/01/16(月) 14:48:27
>>73
Linux版でもそうなります.
これはデフォルトのトップレベル(ocaml)に unix ライブラリが
リンクされてないから(だと思います).
unix ライブラリをリンクしたトップレベルを作るには
$ ocamlmktop -custom unix.cma -o unixtop
みたいな感じで出来ます(Linux版の場合です.Windows版は詳しくないので…).
後は
$ ./unixtop
で,いちいち#loadしなくてもUnixモジュールが使えます.
76デフォルトの名無しさん:2006/01/16(月) 14:58:52
$ ocaml unix.cma
で宵と思われ
77デフォルトの名無しさん:2006/01/16(月) 15:23:27
stdlib と otherlibs(unix 他) の違い:

stdlib: 全てのアーキテクチャで実装されている、はず
otherlibs: されていない可能性がある

例えば Unix モジュールは昔の mac os には実装されていなかったはず。
その代わり、最低限のファイル操作は Pervasives と Sys を通して
提供されている。

そういう経緯のためか unix はデフォルトでリンクされません。
78デフォルトの名無しさん:2006/01/16(月) 15:37:46
そうなのかー。
とりあえず76のやり方でWindowsでもできた。どうもありがとう。
79デフォルトの名無しさん:2006/01/16(月) 16:44:31
Unix モジュールは Windows で完全に動くことが保証されていないのでは。

http://caml.inria.fr/pub/docs/manual-ocaml/manual035.html
には Windows における対応状況が記載されてる。

けど、今どれくらい動くかについては知らないので何とも言えません。
80デフォルトの名無しさん:2006/01/16(月) 22:08:23
UnixモジュールってのはWin使いにもLinux使いにも喧嘩売ってるよな
81デフォルトの名無しさん:2006/01/17(火) 15:28:28
LinuxはUNIX(TM)じゃないから当然だな。
82デフォルトの名無しさん:2006/01/18(水) 15:40:08
>>80
できれば何が不満か詳しく。
83デフォルトの名無しさん:2006/01/18(水) 23:32:48
ドザ・犬厨お断りみたいなふいんき
84デフォルトの名無しさん:2006/01/18(水) 23:51:40
Posixモジュールにすれば丸く収まったかもな。
85デフォルトの名無しさん:2006/01/19(木) 00:38:25
歴史的・宗教的理由は知らないが、Unixというのは何か違う気がするね。
いまさら変える必要はないと思うが。あ、HaskellはPosixだね。
86デフォルトの名無しさん:2006/01/19(木) 00:49:04
SMLもPosixだよ。
しかしどうでもいい。
87デフォルトの名無しさん:2006/01/20(金) 12:59:01
なんだ、名前の問題?
88デフォルトの名無しさん:2006/01/21(土) 13:41:40
OcamlのSyntax Errorって情報少なすぎないですか。
89デフォルトの名無しさん:2006/01/22(日) 02:58:44
なあに、かえって免疫力が付く。
90デフォルトの名無しさん:2006/01/22(日) 12:01:42
JavaがあればMLなんていらないだろ?
91デフォルトの名無しさん:2006/01/22(日) 12:03:49
Java厨はMLにでも入っとけ
92デフォルトの名無しさん:2006/01/22(日) 12:05:28
はいはいいらんいらん
93デフォルトの名無しさん:2006/01/22(日) 23:25:44
いんらんいんらん
94デフォルトの名無しさん:2006/01/23(月) 04:35:53
MLがあればλ計算なんていらないだろ?
95デフォルトの名無しさん:2006/01/26(木) 21:12:56
なんかOcamlで実用的なプログラム作ってますか?
96デフォルトの名無しさん:2006/01/27(金) 00:46:31
SMLofNJ授業でやったけど、マジ地獄だった。
なにこの言語、がんじがらめって感じ。
型推論とかいろんなお節介機能でコンパイルを妨害しまくるし。
cとかjavaの方が1000倍生産性高いわ。
なんの為に存在すんの?
売りはなに?
97デフォルトの名無しさん:2006/01/27(金) 00:57:36
>型推論とかいろんなお節介機能でコンパイルを妨害しまくるし。
これがいいんじゃないか

>cとかjavaの方が1000倍生産性高いわ。
動いてからが地獄だけどね
98デフォルトの名無しさん:2006/01/27(金) 01:00:08
>>97
志村、多分クマ。
99デフォルトの名無しさん:2006/01/27(金) 01:31:21
>>97
じゃあ動きだしたら天国なのか?
100デフォルトの名無しさん:2006/01/27(金) 02:09:22
>>98
???

>>99
天国とまでは・・・微妙
けどコンパイル通すまでにした苦労はむくわれるぞよ
コンパイル通った時点で少なくともCのコードよりはバグが少ないはず
101デフォルトの名無しさん:2006/01/27(金) 11:52:46
釣られるなよ,ってことでしょ
102デフォルトの名無しさん:2006/01/27(金) 16:18:31
自分だけは C で安全な大規模なプログラムが書けると
思っているスーパー墓ーがいるスレはここですか?
103デフォルトの名無しさん:2006/01/27(金) 16:31:06
ああ、大規模プログラム用の超高級言語という売りですか?
確かに地獄の門番が嫌がらせの用にコンパイルを阻んでくる分、
いざコンパイル通ったら信頼性は期待できますね。
でもそれでも同じ型だけど意図以外に書けてコンパイルも通ってしまう事例とか
結構ありそうなもんだが。
まあ大規模システム構築を将来しようと思った時の為に学んでおく価値があるんですかね。
SMLofNJって教育用でしたっけ?
実践用にはどれをやればいいですか?
104デフォルトの名無しさん:2006/01/27(金) 16:37:02
バグの少ないコンパイラ造りにも一役買えそうな言語ですか?
なんかリスト処理とか得意でしたよね。
でもあんまこみいった処理は期待できないな。

骨組みをMLで作って細部はcとかですか?
明後日の方向行っちゃいましたか?
105デフォルトの名無しさん:2006/01/27(金) 16:41:54
OCaml授業でやったけど、マジ天国だった。
なにこの言語、道が一本しかないって感じ。
型推論とかいろんな親切機能で正しくないプログラムのコンパイルを妨害しまくるし。
cとかjavaの方が1000倍バグの生産性高いわ。
なんの為に存在すんの?
売りはなに?
106デフォルトの名無しさん:2006/01/27(金) 17:07:33
>>105
スーパーハカーが仰天超速コードを書ける事
(除Java)

責任の取れる人には自由を与えるべき
107デフォルトの名無しさん:2006/01/27(金) 17:19:26
103 への解答を書いている内に書き込みが増えてしまってるけど、、、

ML type system で表現しきれないデータの invariance を壊せる
プログラムが書けてしまうという意味で 103 の指摘は正しい。
それは invariance を保つような constructer や access function
をちゃんと書いてから実装を隠蔽するとかやればかなり解決できる。
ただ、同じ問題は C, C++, Java にもあるし、同様に解決できるはず
だが、Java はともかく、 C や C++ はそれ以前の問題が多すぎ。
他人が書いた意味不明な seg fault を吐くコードのメンテしたいかい?

SML でも Caml でも Haskell でも、いちいちあげないが非常に複雑な
ソフトウェアシステムはいろいろ開発されているはず。
授業でやらされたからといって教育用の言語と言うわけではないよ。

ML 系のプログラムを学ぶ価値があるかだけど、今しばらくの内に
日本国内で企業で大規模プログラムを書く仕事につきたいのであれば、
逆に学ばないほうがいいかもしれんな。よりよい言語があるって
わかってるのに C でプログラムを書かされるのは正直辛そうだ。(w

自分で起業するか、既に ML に目覚めた開発をしている会社(海外とか
には幾つかある)に就職するとか、会社内で意識変革を起こす気概がある、
というのであれば別だけど…

私の見聞きした範囲では、プログラム開発グループ長ぐらいまでで、
新プロジェクトを C ではなく、 ML での開発とするということに理解を
示す人は、見識の広い人ならば十分いる。問題はそこから先、技術とか
わからん管理職が具体的な数字を示さんと動いてくれないのが問題だ
そうな。そうなると見切って spin-out するって手もあるが、日本では、
難しいか?
108デフォルトの名無しさん:2006/01/27(金) 17:35:41
エスエムエルとかカムルもかハスケルとかの勢力図見して下さい><
SMLofNJで培った常識で他にも容易に参入できますか?
109デフォルトの名無しさん:2006/01/27(金) 18:03:05
(省略されました・・)
のところで笑ってしまった
110デフォルトの名無しさん:2006/01/27(金) 19:44:47
勢力図ってなんだろ、地理的勢力図?
下手すると角が立ちそうだなー。
色々好嫌いはあるだろうけど
言語間の参入はまたく問題ないっしょ。
111デフォルトの名無しさん:2006/01/27(金) 20:42:04
SMLofNJ OCaml Haskell
特徴解説きぼん
112デフォルトの名無しさん:2006/01/27(金) 21:55:49
>>111
いずれも関数型言語。以上
113デフォルトの名無しさん:2006/01/27(金) 22:40:03
時には Clean のことも思い出してあげてください。
114デフォルトの名無しさん:2006/01/27(金) 22:48:57
なかなか複数の言語について自信を
持って言える人はいないのではないか。
115デフォルトの名無しさん:2006/01/27(金) 23:21:10
Haskell 系と ML 系の違いなら分かるが、SML/NJ と OCaml の違いがあんまり分からない。
どっちも触ったが、わりと好みの方を使えばいいんじゃね?と思った。
SML/NJ は let 式に end がいるのがちょっと面倒なのだが、end を書きたいこともあるし。
116デフォルトの名無しさん:2006/01/27(金) 23:22:06
Clean を触ったとき、example でついていた Hello, World! すら動かずに窓から投げすてたことがある。
117デフォルトの名無しさん:2006/01/27(金) 23:58:34
>>115
http://www.ps.uni-sb.de/~rossberg/SMLvsOcaml.html

SML の方が余計な記号が少なくて好き。スッキリしてる。
118デフォルトの名無しさん:2006/01/28(土) 00:51:25
そういう小奇麗さが欲しいときは Haskell 使う。
ML を使う時は大抵ばりばりプログラム書くときだから小奇麗さは気にしない。
119デフォルトの名無しさん:2006/01/28(土) 00:55:16
そういう人もいる... と。
120デフォルトの名無しさん:2006/01/28(土) 12:16:05
Ocamlって未使用オブジェクトはGCしてるんですか
121デフォルトの名無しさん:2006/01/28(土) 12:40:00
MLを保守的に拡張してcにすればいいじゃん。
122デフォルトの名無しさん:2006/01/28(土) 13:09:52
>>120 してないよ。
123デフォルトの名無しさん:2006/01/28(土) 19:25:20
できたら OCaml もしくは O'Caml と書いてほしいなあ
124デフォルトの名無しさん:2006/01/28(土) 20:58:23
週末のムード。。
125デフォルトの名無しさん:2006/01/28(土) 21:13:40
Object(゚听)イラネ
126デフォルトの名無しさん:2006/01/28(土) 21:17:13
MLでC++コンパイラ作ればバグ減るんじゃね?
127デフォルトの名無しさん:2006/01/28(土) 21:17:41
コンパイラのバグは減る
128デフォルトの名無しさん:2006/01/28(土) 22:07:11
ML プログラマが C++ のコンパイラを書いて、
んで、そのコンパイラを自分で使うのだろうか、、、
かなり自虐的だね。

129デフォルトの名無しさん:2006/01/29(日) 00:41:31
コンパイラならC++で作るよりMLで作るほうが楽だよね
130デフォルトの名無しさん:2006/01/29(日) 02:09:52
ML でコンパイラ作らないで何作るんだ。
ML は ML コンパイラを作るための言語であると揶揄されることさえあるのに。
131デフォルトの名無しさん:2006/01/29(日) 07:07:43
でもMLコンパイラはML以外の既存言語で開発されたでしょ?
やっぱバグの疑いを拭いされないんじゃね?
ML的に完璧に正しくコーディングできても。
132デフォルトの名無しさん:2006/01/29(日) 07:44:14
昔からコンパイラ開発はそのコンパイラ自身を使うことが
言語や処理系のパワーの証明となっているのですな。
だからMLもMLコンパイラでコンパイルすればいい。
gccがCで書かれてるのと同じようなもんだ。
133デフォルトの名無しさん:2006/01/29(日) 08:38:47
でも最初はそれよりプリミティブな言語で初コンパイラを生成するはずでしょ?
自己記述?はその後でしょ?
134デフォルトの名無しさん:2006/01/29(日) 09:05:14
もちろん、そのとおり。
でもMLみたいに言語記述に向いている言語なら
プリミティブな言語は使わないで、
最初からML自身で処理系を書けばいいんじゃないの?
という >131 へのコメントでした。
すでにいくつもMLコンパイラは出ているし、
それで困らないと思うんだけど。
135デフォルトの名無しさん:2006/01/29(日) 09:55:45
ですね。
とは言え、バグの疑いを拭いされる日は多分永遠に来ないですね。
136デフォルトの名無しさん:2006/01/29(日) 09:58:50
これからSMLofNJを教養としてたしなむ俺様に参考書薦めなさい。
137デフォルトの名無しさん:2006/01/29(日) 10:08:29
138デフォルトの名無しさん:2006/01/29(日) 11:51:21
JAVAでMLのコンパイラ作ればいいじゃん
JAVAなら安全性もあって、まともな言語だし、
所詮おもちゃのMLとはおおちがいだよ。
139134:2006/01/29(日) 11:53:03
>135
バグの疑いを払拭できる日・・・それはどの言語、どの処理系を使っても無理ですねぇ。
140デフォルトの名無しさん:2006/01/29(日) 11:55:41
ぜんかくえいすう...
141デフォルトの名無しさん:2006/01/29(日) 11:56:52
>>137
即席であなたのカスタマレビューをつけたまえ。
142デフォルトの名無しさん:2006/01/29(日) 11:59:12
おいMLはおもちゃ程度のアプリしか作れないのか?
143デフォルトの名無しさん:2006/01/29(日) 14:06:06
チューリングマシン等価だから、(理論的には)世の中の全てのアプリが書けるよ。
144デフォルトの名無しさん:2006/01/29(日) 14:16:37
労力というコストパフォーマンスは?
アプリ制作において。
エディタとか2chブラウザとか、アクションゲームとか
ライブラリは貧弱なの?
145デフォルトの名無しさん:2006/01/29(日) 14:35:49
O'CamlだとOpenGLとか、GTK+2とか、SDLとか使える。
146デフォルトの名無しさん:2006/01/29(日) 17:57:49
>>145
マジで!?OCamlでゲーム作ってる人いるの?
147デフォルトの名無しさん:2006/01/29(日) 18:20:12
148デフォルトの名無しさん:2006/01/29(日) 20:42:07
>>141
即席レビュー

2冊とも良かったです。以上
149デフォルトの名無しさん:2006/01/29(日) 21:20:32
OcamlってC++でいうconst修飾子ってないの?
150デフォルトの名無しさん:2006/01/29(日) 21:21:32
>>148
1人中0人が参考になったと言っています。
151デフォルトの名無しさん:2006/01/29(日) 21:26:10
>>149
残念ながらない
152デフォルトの名無しさん:2006/01/29(日) 22:14:18
なんで残念ながらなのかようわからんが、151は釣りか。

153デフォルトの名無しさん:2006/01/29(日) 22:35:25
ヒント: string は mutable
154デフォルトの名無しさん:2006/01/30(月) 01:28:49
stringを指す変数自体が非constなわけじゃないべ。
155デフォルトの名無しさん:2006/01/30(月) 09:08:30
それはへりくつ
156デフォルトの名無しさん:2006/01/30(月) 09:34:42
www.motiontwin.com
100% ではないと思うが Caml でゲームの開発をしている。
157デフォルトの名無しさん:2006/01/30(月) 10:28:27
155はCですらポインタが絡むとconstを正しく使えないと見た。
158デフォルトの名無しさん:2006/01/30(月) 16:06:44
はなから全部MLでアプリ作ろうとは思わんでしょ?
骨組みを手っ取り早く作れるって言語じゃないの?
仕様的に、込み入った処理ができるとは思えない。
159デフォルトの名無しさん:2006/01/30(月) 16:15:46
それは頭が悪いから。
160デフォルトの名無しさん:2006/01/30(月) 16:21:27
>>96
「間違ったコードに対してエラーを出すコンパイラは糞だ」とおっしゃりたいのですね?
161デフォルトの名無しさん:2006/01/30(月) 16:25:25
>>158
込み入った処理ってどんなの?
162デフォルトの名無しさん:2006/01/30(月) 17:16:46
SML/NJ で引数の型を指定する場合
  - val hd2 = fn x:int list => hd x;
  val hd2 = fn : int list -> int
は問題なく動作も予想通りなのですが, 同じものを fun で定義しようとすると
  - fun hd2 x:int list = hd x;
  val hd2 = fn : int list list -> int list
list が一段深くなってしまいます.
型の指定を int とだけすると
  - fun hd2 x:int = hd x;
  val hd2 = fn : int list -> int
のようになります.
型全体を ( ) で囲んでも
  - fun hd2 x:(int list) = hd x;
  val hd2 = fn : int list list -> int list
結果は変わらず, 引数を含めて ( ) で囲むと
  - fun hd2 (x:int list) = hd x;
  val hd2 = fn : int list -> int list
ようやく期待通りの結果となります.
  - fun hd2 x:int = hd x;
  - fun hd2 x:int list = hd x;
はどのように解釈されているのでしょうか?
163デフォルトの名無しさん:2006/01/30(月) 17:20:28
hd2 x 全体が int / int listと解釈されてるんでしょうね.
164デフォルトの名無しさん:2006/01/30(月) 17:29:53
納得しました. ありがとうございました.
165デフォルトの名無しさん:2006/01/30(月) 17:40:22
>>160
厳密には間違っているけど、動作上意図に完璧に沿う時
Cはコンパイル通してくれるが、MLは駄目だ許さんのいってんばり。
学者のように融通がきかん。
166デフォルトの名無しさん:2006/01/30(月) 17:43:36
要するに煩く括弧つければいいって事ですか?
167デフォルトの名無しさん:2006/01/30(月) 17:43:43
なんで自分の頭が悪いんじゃないかと省みることをしない人が増えたんだろう
168デフォルトの名無しさん:2006/01/30(月) 17:46:56
>>165
動作上意図に沿わない時にも通してくれちゃうのが問題。
あと、Cにも「直感的には大丈夫なのにだめだしされる場合」はあるよ。
同一メモリを互換性のない複数の型でアクセスするのはだめ、とかね。
169デフォルトの名無しさん:2006/01/30(月) 21:50:26
この関数を呼んでもstringが破壊されることがないっていうのを
コンパイル時チェックで保証できたほうがいいし、
MLの言語設計の他の部分とも考え方が合わないかな?
170デフォルトの名無しさん:2006/01/30(月) 21:59:03
現状もっともすごいプログラム言語はMLだろ?
171デフォルトの名無しさん:2006/01/30(月) 22:14:56
>なんで自分の頭が悪いんじゃないかと省みることをしない人が増えたんだろう
無駄な勉強やるくらいならHaskellやった方がましだろ。
172デフォルトの名無しさん:2006/01/31(火) 01:07:40
>>169
つーか、string が mutable なこと自体が間違い。
Xavier 自身も「OCaml を書き直すことがあったら immutable にするだろう」って言ってる。

>>171
そういうやつは Haskell も理解できないと思われ。
173デフォルトの名無しさん:2006/02/01(水) 09:46:29
ところで、
option と Some の使い方がイマイチわかりませぬ
174デフォルトの名無しさん:2006/02/01(水) 11:16:20
>>173
値がない状態を None、値がある状態を Some value に統一しとくのさ。

値がない状態を意味するのに 0 とか -1 とか負の数とか "" とか null とか
Nothing とか DBNull とか色々あると面倒でしょ?
175デフォルトの名無しさん:2006/02/01(水) 16:58:22
サンクスです。じゃ、たとえば

let equal_one x = if x = 1 then (Some("ok")) else None;;

とか定義すると

val equal_one : int -> string option = <fun>

とかなって、上の option の意味するニュアンスは、
「値があるなら戻り値は string 型を内包する Some だお」
「値がないなら一律で None だお」
と言っているわけですね?
176デフォルトの名無しさん:2006/02/01(水) 18:13:32
>>175
その通りでつ。
option 型にすることで、意味のない値を返さなくてすむのさ。
関数が失敗したら null を返すとかではなくて、None を返せば、いみのない値を間違って
使ってしまう危険性もなくなるわけだな。option 型だと match させないと値を
とりだせないわけだから。
177デフォルトの名無しさん:2006/02/01(水) 22:55:31
勉強になりますた
178デフォルトの名無しさん:2006/02/01(水) 23:49:22
エラーチェックが面倒で、いつも valOf を使ってしまう…
よくないのは分ってるんだけどね。
179デフォルトの名無しさん:2006/02/01(水) 23:57:56
それなら ExtLib 使えよ。
http://ocaml-lib.sourceforge.net/doc/Option.html
180デフォルトの名無しさん:2006/02/01(水) 23:59:14
1 + 0.1がコンパイルエラーになるなんてこんな糞言語初めてだ
181デフォルトの名無しさん:2006/02/02(木) 01:50:13
そこで SML ですよ(何
182デフォルトの名無しさん:2006/02/02(木) 04:04:18
>>180
それ俺も思った
まさに鬼
183デフォルトの名無しさん:2006/02/02(木) 08:43:04
>>180
1 + "0"
もコンパイルエラーにしないほうがいい?
184デフォルトの名無しさん:2006/02/02(木) 10:00:32
>>175
例題がいまいちだなー。equal_one だと int -> bool と思えてしまう。

例えば、環境変数HOMEの内容を読み込むとしよう。

let get_home () =
try
Some (Sys.getenv "HOME")
with
Not_found -> None

環境変数は定義されているかどうか不明だから、値がない場合は None, それ
以外は Some になる訳だ。



185175:2006/02/02(木) 11:28:41
>>184
確かに漏れのは、よくなかったね
環境変数とかのサンプルの方が使いどころがわかっていい感じでつ
なんだかんだでサンプルコードを見るのが一番近道であると
186デフォルトの名無しさん:2006/02/02(木) 11:42:44
>> 181
落ち着け。 1 + 0.1 は SML でもエラー。
もちろん 1.0 + 0.1 なら SML は OK。Caml は×。

はぁ。どこの大学の授業で O'Caml/SML 教えているか知らんけど、
(+) についてはもっときちんと解説するべきでは?
初学者が去っていく第一関門に成りかねないだけに TA には
是非頑張ってほしいと思います。

個人的には今の SML 方式が現実的かと思う。
これなら Caml で実装するのも簡単なんだけどな。改造するか。
187デフォルトの名無しさん:2006/02/02(木) 11:50:33
>>181はOCamlだけ叩いてんじゃなくてML全部叩いてんだろ。
188デフォルトの名無しさん:2006/02/02(木) 11:57:45
>>187
あ、ごめ。>>180に言ってるのだと勘違いした。
OCamlだけ叩いてると勘違いしたのが>>181か。
189デフォルトの名無しさん:2006/02/02(木) 12:03:46
公理的集合論の基礎ぐらいはやっておいた方がよい?
190デフォルトの名無しさん:2006/02/02(木) 13:50:46
さんざん既出だけど、そこで G'Caml ですよ、奥さん。
本当にありがとうございました。
191デフォルトの名無しさん:2006/02/02(木) 21:42:50
オーバールーdぃんぐ
192デフォルトの名無しさん:2006/02/03(金) 12:41:19
Ocamlで作ったプログラムってライセンス的にどう縛られるの?
ライセンス文読んだけどよくわからん。
基本LGPLだけど静的リンクでもライブラリに変更が無ければ縛られない?
193デフォルトの名無しさん:2006/02/03(金) 14:22:03
簡単に言うと、
配布ライブラリに変更を加えていなければクローズドソース開発可能。
配布ライブラリを改造した場合でも基本的に同様だけど、
ライブラリの改造部分に関してだけは成果をコミュニティーに
バックしてね、ということ。

コンパイラ部分が QPL なのは Caml-Light 時代にパクリ事件があったため。
194デフォルトの名無しさん:2006/02/05(日) 05:37:52
Ocamlでリストの一部を変えたリストを作ったり間に挿入したりするのってどうやってる?
いったん配列にして破壊的に編集するのがいいのかな。
195デフォルトの名無しさん:2006/02/05(日) 17:39:45
そもそもそんなデータ構造ははじめからリストとして実装しないだろ?
196デフォルトの名無しさん:2006/02/05(日) 20:04:32
でもOcamlの配列って拡張不能っぽいじゃん
197デフォルトの名無しさん:2006/02/05(日) 20:45:36
拡張可能だよ
198デフォルトの名無しさん:2006/02/05(日) 20:58:05
えっ、できるの?
10年以上 Caml 使ってるけど、、、知らんかった。
どうするの?わくわく。
199デフォルトの名無しさん:2006/02/06(月) 01:59:55
>>194
>>198
楽しい?
200デフォルトの名無しさん:2006/02/06(月) 03:38:41
10年以上 Caml 使ってるなら以下略
201デフォルトの名無しさん:2006/02/06(月) 10:11:30
>>194
Zipper で解決できそうだ。結構便利だぞ。

ただし、解こうとしている問題に対して、本当に「リストの一部を変えたリス
トを作ったり間に挿入したりする」操作がベターなアルゴリズムなのか、再考
してからね。

202デフォルトの名無しさん:2006/02/06(月) 10:21:41
ocamlfind ocamlc hoge.ml
とかやってもhoge.ml がコンパイルされない・・・なぜ?
エラーが出るとかそういうこともなく、ただコンパイル処理にならない。
これが動かないので ocamlfind 使ったMakefile が失敗します。。。
誰が、同じようなトラブルになった人いませんか?
ちなみに ocamlfind list は動作します。
203202:2006/02/06(月) 10:47:15
おおっと
/usr/local/etc/findlib.conf
で、ocamlc="ocamlc.opt" → ocamlc = "ocamlc"
と変更したら上手くいった・・・なんで?
204202:2006/02/06(月) 11:21:30
なんか、新しいバージョンのパッケージをインストールした後に
ときたま、ocamlfind list としてもバージョンが変わってないときあるよね?
これってパッケージ作成者の作業抜け?
自分でsite-lib/packagename 内の META ファイル書き換えなきゃいけないの?
205デフォルトの名無しさん:2006/02/06(月) 12:21:12
Ocamlで拡張可能な配列が実装できないと本気で思ってるの?
206デフォルトの名無しさん:2006/02/06(月) 14:14:17
METAが書き変わってないのを発見したら、開発者に教えてあげると良い希ガス。
作業抜けだろう。
207デフォルトの名無しさん:2006/02/06(月) 15:06:43
O'Caml を使って拡張可能な配列が実装できるかどうか、
と、
O'Caml native な配列が拡張可能であるかどうか、
は全く違う。

ちなみに、 Obj.truncate を使えばブロックの短縮は出来る。
詳細は byterun/obj.c を参照。でも、実際に使われているのを
見たことは無い。Planar 専用機能という専らの噂。
208デフォルトの名無しさん:2006/02/06(月) 18:50:26
>>202
ocamlc.opt を作り忘れてた! なんて事はないですよね?
209デフォルトの名無しさん:2006/02/07(火) 12:59:53
横内さんの「プログラム意味論」の正誤表ってどこかにないでしょうか?
誤字(誤植?)っぽいのが多くて何を信じたらいいか分かんないよ・・・(´・ω・`)
210デフォルトの名無しさん:2006/02/07(火) 22:15:16
標準でUnicode対応してほしいなあ。F#つかえばいいんかな。
211デフォルトの名無しさん:2006/02/07(火) 22:42:22
>>210
F#でもパーサの問題で日本語は表示できんよ。
212デフォルトの名無しさん:2006/02/08(水) 00:54:03
WDialog 使ってみた人いる?
コレって FastCGI 対応してるんだよね?
本家サイトの説明見る限りじゃかなり期待できそうなんだが
213212:2006/02/09(木) 19:22:18
今日使ってみますた
ui のパーサが駄目駄目
凝ったページが書けねえ
や〜めた
214デフォルトの名無しさん:2006/02/11(土) 19:53:23
WideStudio ってOcaml に対応してたんだね
215デフォルトの名無しさん:2006/02/12(日) 11:16:48
Zipperおもしろいな。目からうろこが落ちた。
216デフォルトの名無しさん:2006/02/13(月) 16:03:41
質問させてください。この間、偶然タイプミスから見つけたことなんですが

let a = `a;;

とかすると

val a : [> `a] = `a

とかなりますよね?
これってどういう意味なんですか?
217デフォルトの名無しさん:2006/02/13(月) 16:09:55
218デフォルトの名無しさん:2006/02/13(月) 16:49:35
>>217
有難うございました!
219デフォルトの名無しさん:2006/02/13(月) 22:49:18
Camomile で、Unicode の文字列を分割した文字列を取る方法が
わかりません

open Camomile
let str = "あいうえお" (* UTF8 *)
let utext = UText.of_string str (* string -> utext *)
let utext_sub = UText.sub utext 0 1 (* utext_sub = "あ"? *)

ここで、utext_sub を string 型に変換したいんだけど・・・
わかる人いませんか?
220219:2006/02/13(月) 23:54:44
ごめん、自己解決しますた。
SubText モジュール使えばいいんだ。

module Sub = SubText.Make(UTF8)
let str = "あいうえお"
let s1 = Sub.refer str 0 1
let _ = print_string (Sub.excerpt s1)

とすると無事に "あ" が出力される
こんなんでいいのかな?
221219:2006/02/14(火) 23:10:00
おおっと
自己解決かと思いきや、

let s1 = Sub.refer str 0 2

としても”あ”が出力されてしまふ
これってバグなんだろうか?
222デフォルトの名無しさん:2006/02/15(水) 00:01:29
ああ、どうも 数字はバイト位置を指定するらしいすわ

let s1 = Sub.refer str 0 4

で”あい”となる見たい

スレ汚しすまんです・・・
223デフォルトの名無しさん:2006/02/16(木) 13:17:44
下のプログラムを実行して kill -HUP すると uncaught exception が
発生してしまう。
Event モジュールとシグナルって一緒に使うとまずいんですかね?

open Event

let mput ch =
while true do
sync (send ch 1);
Thread.delay 0.1
done

let mget ch =
while true do
sync (receive ch);
Thread.delay 0.1
done

let interrupt n =
Printf.printf "i am %d\n" (Thread.id (Thread.self ()));
flush stdout

let _ =
let _ = Sys.set_signal Sys.sighup (Sys.Signal_handle interrupt) in
let ch = new_channel () in
(* Fire up the compute thread: *)
let t1 = Thread.create mput ch in
let t2 = Thread.create mget ch in
while true do
Thread.delay 1.0
done
224デフォルトの名無しさん:2006/02/16(木) 19:41:54
>>223
おんなじことやってみたけど、問題なかったよ
sig_test.ml とかを

ocamlc -thread unix.cma threads.cma -o test sig_test.ml

とかコンパイルしてみた。環境は Ocaml 3.09
225224:2006/02/16(木) 20:08:35
あ〜ごめん、vmthreads の方をリンクしたら問題なかったけど
threads の方をリンクしたら
Unix.Unix_error(11, "select", "")
とかなったなあ
226デフォルトの名無しさん:2006/02/17(金) 01:00:17
>>223の自己レス
上のコードの Thread.delay を外したら例外が出なくなったので delay のせ
いかと思いきや、下のコードでも -HUP で例外発生。むー。デーモン君を作り
たかっただけなんだけど、素直に equeue ライブラリ使えってことか?

open Event
let (@@) f x = f x

let wait_accept () =
let socket = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
let _ =
Unix.bind socket @@ Unix.ADDR_INET (Unix.inet_addr_any, 1025);
Unix.listen socket 10
in
let make_accept socket =
let ac_channel = new_channel () in
let accept_send () = sync @@ send ac_channel @@ Unix.accept socket in
let _ = Thread.create accept_send () in
receive ac_channel
in
sync (make_accept socket)

let interrupt n =
Printf.printf "i am %d\n" (Thread.id (Thread.self ()));
flush stdout

let _ =
let _ = Sys.set_signal Sys.sighup (Sys.Signal_handle interrupt) in
wait_accept ()
227デフォルトの名無しさん:2006/02/17(金) 01:46:32
さらに事故れす。
socket を nonblock にして返事が戻ってくるまでループさせるようにしたら、
無事シグナルが使えた。

let rec loop () =
try
Unix.accept socket
with
_ -> loop ()
in
sync @@ send ac_channel @@ loop ()

ちょと調べてみると、otherlib/unix/accept.c を見る限りでは、

enter_blocking_section();
retcode = accept(Int_val(sock), &addr.s_gen, &addr_len);
leave_blocking_section();

なので、本来は accept 中はブロックされるみたい。シグナルで無理に起こし
ちゃまずいのかも。
# Cコード呼び出しは全部該当する気がしてきた...--;
228デフォルトの名無しさん:2006/02/17(金) 14:31:27
>let (@@) f x = f x
コレ、いいね。
漏れも使おう
229デフォルトの名無しさん:2006/02/18(土) 21:37:18
バイナリファイルを読み書きするときにintが31ビットっていうのがいちいち不便。
わざわざInt32を使うのもなんか納得いかない。
230デフォルトの名無しさん:2006/02/18(土) 21:47:56
MLton は Integer が 32bit だったような気がするけど。
231デフォルトの名無しさん:2006/02/18(土) 21:58:27
mld
232デフォルトの名無しさん:2006/02/18(土) 22:00:15
>>229
char 使いなよ。
233デフォルトの名無しさん:2006/02/18(土) 23:22:27
Ocamlでスレッドってどうやって使うの、いちいち詳しく手順おしえて。
234デフォルトの名無しさん:2006/02/19(日) 02:16:13
とりあえず手順1としては http://caml.inria.fr/pub/docs/manual-ocaml/manual038.html を熟読することだな。
235デフォルトの名無しさん:2006/02/19(日) 02:34:53
>>234 Fortranスレッドで聞くと、すごく親切に教えてくれる
   Cスレッドで聞くと、普通に教えてくれる
   JAVAスレッドで聞いても結局は教えてくれる。
   でMLすれっどできくとこれかよw

   そんなんじゃ、MLユーザー増えないよ。
236デフォルトの名無しさん:2006/02/19(日) 07:44:31
要は説明できるほど理解してないと
237デフォルトの名無しさん:2006/02/19(日) 08:36:57
>>229
char でよいとおも
238デフォルトの名無しさん:2006/02/19(日) 09:03:13
>>233みたいな「教えて君」には使って欲しくないって事だろ(w
239デフォルトの名無しさん:2006/02/19(日) 09:43:28
無能は重罪だからな(w
240デフォルトの名無しさん:2006/02/19(日) 13:25:03
>>232
>>237
バイナリファイル上で32ビット整数があってOcamlでInt32で表現して計算をしたい場合
*put_binary_intは使えないから*put_byteを4回繰り返してビット演算でInt32に対応させるしかないじゃない。
なんでこんなことしなきゃならんのと思わないかい。
241デフォルトの名無しさん:2006/02/19(日) 14:57:02
>>240
MLを使うのが間違い
242デフォルトの名無しさん:2006/02/19(日) 15:11:46
外部データを読み書きする時は、どうせバイトオーダーに合わせてビット操作が発生するんだから、
バイト単位の読み込みで良いじゃんよ。
243デフォルトの名無しさん:2006/02/19(日) 16:13:47
正規表現あつかうときなんだけど

let regexp_str = "\[aaa\]"

とかすると、コンパイル時に

Warning : illegal backslash escape in string.

とか出てしまう。
プログラム本体はこれで上手く動いてるからいいっちゃいいんだけど。
この辺の警告はしょうがないんだろうか。
244デフォルトの名無しさん:2006/02/19(日) 17:04:08
>>243
\が正規表現上のエスケープではなく文字列リテラル表現上の
エスケープと解釈されてるのではないか。
\[aaa\] という正規表現ならば"\\[aaa\\]"と書くべし。
245デフォルトの名無しさん:2006/02/19(日) 18:17:56
>>244
あわわ
本当だ、ボケまくりでした
dクスです
246デフォルトの名無しさん:2006/02/19(日) 18:42:01
SML/NJとMLtonでどちらがおすすめですか?
247デフォルトの名無しさん:2006/02/19(日) 18:46:29
ttp://blogs.msdn.com/dsyme/archive/2006/02/19/534925.aspx
天下のMicrosoftが関わるとこんなすごい物が出来上がるんだな。
研究者がコソコソオナニー開発したところでこのレベルには一生たどり着けないだろwww
248デフォルトの名無しさん:2006/02/19(日) 19:09:54
>>247がMicrosoft Researchのメンバーを見たあと
再び同じ台詞を言うことを期待。
249デフォルトの名無しさん:2006/02/19(日) 19:11:21
>>247
痛々しいなあ。w
250デフォルトの名無しさん:2006/02/19(日) 19:11:40
MLton でネイティブスレッドが使えるようになれば、MLton なんだけどなぁ。
251デフォルトの名無しさん:2006/02/20(月) 09:44:23
>>227
また事故れす。
Unix.set_signal じゃなくて Thread.wait_signal が正解でした。
お騒がせしました。
252デフォルトの名無しさん:2006/02/20(月) 14:21:50
>>233
OCaml でマルチスレッドなプログラムを作る場合、二通りのスタイルがある。

1) Thread,Mutex,Conditionモジュールを駆使して、従来の pthread ライブラ
リを叩くような感覚で事を進めるスタイル。pthread を使った事がある人
やマルチスレッドプログラミングをかじった事がある人は難なく使える。
ディープな人には物足りない。

2) Thread,Eventモジュールを駆使してお気楽にマルチスレッドを扱える、
concurrent プログラミングと呼ばれるスタイル。concurrent プログラミ
ングに初挑戦の場合、最初は意味が分からない。でも、分かってくれば便
利。基本的に一対多の同期はできないので、やっぱりディープな人には物
足りない。

どちらかというと、2)をお薦め。せっかくOCamlでやるのだから。
253デフォルトの名無しさん:2006/02/20(月) 14:32:48
例題として、二つの計算を別スレッドで立ち上げて、それらの計算結果を表示
するプログラムを作ってみよう。

open Event

let compute_mul ch = sync (send ch (7 * 8))
let compute_add ch = sync (send ch (7 + 8))

let _ =
let mul_ch = new_channel () in
let add_ch = new_channel () in
ignore (Thread.create compute_mul mul_ch);
ignore (Thread.create compute_add add_ch);
Printf.printf "mul %d\n" (sync (receive mul_ch));
Printf.printf "add %d\n" (sync (receive add_ch))

これを th.ml として保存しコンパイル。

$ocamlc -thread -o test unix.cma threads.cma th.ml
$./test
mul 56
add 15

となるはず。これができれば第一歩ですな。

254デフォルトの名無しさん:2006/02/20(月) 14:42:30
同じ事だけど、こっちの方がいいかも。スレッドを作って、それへのチャネル
を返すというスタイルが基本。

open Event

let compute_mul () =
let ch = new_channel () in
ignore (Thread.create (fun () -> sync (send ch (7 * 8))) ());
ch

let compute_add () =
let ch = new_channel () in
ignore (Thread.create (fun () -> sync (send ch (7 + 8))) ());
ch

let _ =
let mul_ch = compute_mul () in
let add_ch = compute_add () in
Printf.printf "mul %d\n" (sync (receive mul_ch));
Printf.printf "add %d\n" (sync (receive add_ch))
255デフォルトの名無しさん:2006/02/20(月) 15:05:23
>>252
横槍ですまんですが、「一対多の同期はできない」とはどういう意味?
Mutex だと、スレッドが一つのリソースをロックしている間に
その他のスレッド全部をブロックできるけど、concurrent を使うと
それができないってこと?
256デフォルトの名無しさん:2006/02/20(月) 15:39:01
マルチランデブーをサポートしていないということかな?
257デフォルトの名無しさん:2006/02/20(月) 16:08:47
>>255
send, receive, sync という操作はチャネルを通じて、そのチャネルの両端に
いるスレッド同士の一対一の同期を実現しています。

一方で、一対多の同期(例えば receive 一発で複数の計算の終了を待つ)は
Event モジュールでは扱えません、という意味です。
# もしかして間違ってる? 識者の方コメントよろしく。

もちろん複数の計算結果を取りまとめるスレッドを作って、そのスレッド経由
で同期を図れば、一対多の同期もすぐにできます。あくまで Event モジュー
ルの話なので。
258デフォルトの名無しさん:2006/02/20(月) 16:15:24
>receive 一発で複数の計算の終了を待つ
pthread で スレッドハンドルを配列でまとめて join するようなのと
同じ様な操作は Event.sync では実現できない、という
ようなことでしょうか?
259デフォルトの名無しさん:2006/02/20(月) 16:51:08
>>258
exactly. ちなみに、共有リソースはこんな感じで。

open Event
type 'a mvar = { takeCh : 'a channel; putCh : 'a channel; ackCh : bool channel }
exception Put

let mVar () =
let takeCh = new_channel () and putCh = new_channel () and ackCh = new_channel () in
let rec empty () =
let x = sync (receive putCh) in
sync (send ackCh true);
full x
and full x =
select [
wrap (send takeCh x) empty;
wrap (receive putCh) (fun _ -> sync (send ackCh false); full x)
]
in
ignore(Thread.create empty ());
{ takeCh = takeCh; putCh = putCh; ackCh = ackCh }

let take { takeCh = takeCh } = receive takeCh

let put { putCh = putCh; ackCh = ackCh } x =
sync (send putCh x);
if sync (receive ackCh) then ()
else raise Put
260デフォルトの名無しさん:2006/02/20(月) 18:22:09
ムズカシス (´・ω・`)
261デフォルトの名無しさん:2006/02/22(水) 07:41:42
慣れだよ、慣れ
262デフォルトの名無しさん:2006/02/26(日) 00:25:26
yappari
ムズカシス (´・ω・`)

263233:2006/02/26(日) 00:26:44
まじでムズカシス (´・ω・`)



264デフォルトの名無しさん:2006/02/26(日) 10:46:21
>>259 は難しい
けど、それ以外はそうでもないと思うに一票
265sage:2006/02/27(月) 02:10:33
>>259は少し先走りすぎたかな。
じゃー、マルチスレッド状態で、複数のスレッドから読み書きできてかつ安全な変数"cell"を定義してみよう。

open Event
type 'a cell = { getCh : 'a channel; putCh : 'a channel }

let get { getCh = getCh } = sync (receive getCh)
let put { putCh = putCh } x = sync (send putCh x)
let cell x =
let getCh = new_channel () in
let putCh = new_channel () in
let rec loop x = select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) loop
]
in
ignore (Thread.create loop x);
{ getCh = getCh; putCh = putCh }

let _ =
let c = cell 10 in
put c 20;
Printf.printf "v=%d\n" (get c)
266デフォルトの名無しさん:2006/02/28(火) 12:12:22
>>265
う〜む、select は、リストされたイベントがそれぞれアトミックに
処理されるための処理ですよね?だけど、そこから先がよくわからない
特に以下の部分

let rec loop x = select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) loop
]

が難しい

event.mli で、wrap はヘッダの説明だと

val wrap : 'a event -> ('a -> 'b) -> 'b event
(** [wrap ev fn] returns the event that performs the same communications
as [ev], then applies the post-processing function [fn]
on the return value. *)

とあるけど、 例えば、 wrap a fn とあった場合は
a というイベントが起きたとき、処理された結果に対して fn を適用する?
みたいな意味なんでしょうか?英語が上手く理解できないかも

select [wrap....] の部分は具体的にはどういうことをしているのでしょうか?
267デフォルトの名無しさん:2006/03/01(水) 12:12:12
>>266 良い質問です。自然言語で解説してみましょう。

select の部分は、[...] のリストの中に有るイベントの内、最初に発生した
イベントを選んで実行せよ、という意味。アトミックという言葉が適切かどう
か判りませんが、他のイベントは破棄されるという意味で排他的です。

send getCh ... は、getCh というチャネルに x を送信するイベントですが、
受け取る相手が確定するまで待つイベント。

wrap (send getCh...) (fun () ...) は、(send getCh...) イベントが発生し
たらその後に、(fun () -> ...) を実行せよというイベント。

receive putCh は、putCh というチャネルからデータを得るイベント。もちろ
ん putCh にデータが流れてくるまで待ちます。

wrap (receive putCh) loop は、(receive ..) イベントが発生したらその後
に、受け取ったデータを loop に渡して loop を実行せよというイベント。受
け取ったデータはループを回りながら保持されているので、破壊的代入は一切
行われません。

ちなみに、イベントが発生した後に特定の関数を呼び出すのが、wrap。イベン
トが発生する前に特定の関数を呼び出すのが guard です。
268デフォルトの名無しさん:2006/03/01(水) 18:48:08
>>267
う〜ん・・・
wrap,sellect に関する意味合いは何となくわかりましたが・・・
以下の点がまだよくわからないです

cell を利用する外部のスレッドは、
getCh から受信して、
putCh に送信しますよね?

でも、cell が起動したスレッドでは
getCh に対する「送信」イベントをフックして (fun () -> loop x)
putCh に対する「受信」イベントをフックして loop

送信と受信がcell の内部と外部(この言い方でいいのかわからないですが)
で逆ですよね?これがよくわからないです。

例えば、外部のスレッドが cell から受信するとき、
(すなわち getCh から受信しようとするとき)、
cell 内部ではgetCh に対する送信イベントが起こる?のでしょうか?

また、cell に送信するとき、
(すなわち putCh へそうしんしようとするとき)、
cell 内部では putCh に対する受信イベントが起こる?のでしょうか?

2つのスレッドが相互にチャンネルに対して送受信の要求をしたとき、
もし片方のスレッドが受信を試みたら、もう片方のスレッドがそのチャネルに
対して送信するようなイベントが発生する?のでしょうか?
そういうものなのでしょうか?
269268:2006/03/01(水) 18:56:34
ああ、チャネルって、相互のスレッド間の通信のための仕組みだから
片方のスレッドが受信しようとすると
もう片方のスレッドでは送信イベントが起こるってことか
ひょっとして考えて見リャ当たり前なのかな?
270デフォルトの名無しさん:2006/03/01(水) 22:10:01
>>269
そうです、チャネルの片方で送信すれば、もう片方では受信しなければいけま
せん。

これは、ネットワーク越しの通信でも、サーバがデータを送信すれば、クライ
アントはデータを受信しなくてはいけないのと全く同じです。
271デフォルトの名無しさん:2006/03/01(水) 23:41:00
>>270
よっしゃ!ようやく理解した!
師匠、ありがとうございますた!
272デフォルトの名無しさん:2006/03/02(木) 17:25:29
すばらしい。意欲的に理解しようとする人を歓迎します。

では、早速ですが、応用課題ですw 興味のある方はどんどん答えてください。

Q. cell は複数のスレッドから読み書きできる変数として使用できるものでし
た。では cell を改造して、「一度誰かが書き込んだら、二度と書き込めず、
読み込みだけは何度でも出来る変数」を作ってください。


273デフォルトの名無しさん:2006/03/02(木) 19:28:33
P1(x) := write(x).P2(x)
P2(x) := read(x).P2(x)
P := ΣP1(x)
274271:2006/03/02(木) 20:07:55
let cell x =
let getCh = new_channel () in
let putCh = new_channel () in
let rec loop_ex fix x =
select [
wrap (send getCh fix) (fun () -> loop_ex fix x);
wrap (receive putCh) (loop_ex fix)
] in
let rec loop x =
select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) (fun fix-> loop_ex fix fix)
] in
ignore (Thread.create loop x);
{ getCh = getCh; putCh = putCh }

let _ =
let c = cell 10 in
Printf.printf "v=%d\n" (get c) ;
put c 20;
Printf.printf "v=%d\n" (get c) ;
put c 10;
Printf.printf "v=%d\n" (get c) ;

一応、結果は10,20,20と出る

>>273
よくわからないけれど正解なんだろうね・・・
数学ワカンネ
275デフォルトの名無しさん:2006/03/02(木) 21:49:40
273はprocess代数式でしょう。
MLの並行processもこんな風に簡潔に書ければいいね。
276271:2006/03/02(木) 22:12:35
誰か >>273 の大雑把な読み方を教えてちょうだいな
ようはどういうことを言っているの?
サラっと数式を書かれると微妙に凹む
277デフォルトの名無しさん:2006/03/02(木) 22:52:39
へー、プロセス代数なんて物があるのか...
278デフォルトの名無しさん:2006/03/03(金) 10:25:29
>>247
すばらしい。これも一つの答です。

ただ、put が常に成功するので、本当に書き込めたのかどうか判りづらいのが
難点ですね。2回目以降 put しようとすると例外が発生するなどすると、より
使い易いでしょう。


279デフォルトの名無しさん:2006/03/03(金) 10:26:53
>>274でした。失礼しました。
280デフォルトの名無しさん:2006/03/05(日) 00:14:39
Java信者がJavaでハッピーならそれを邪魔する必要がどこにある?
MLor関数型を否定してきても、相手するのは一番後回しでいいんじゃね?
281デフォルトの名無しさん:2006/03/05(日) 01:27:14
274の人じゃないけど、278の人としては 259の mVar みたいに
・最初に書き込まれるまでは receive しかしない
・書き込まれたら send できるようになる
っていう方式ということ?

259 はさらに、いったん書き込まれたあとでもまた上書きできるようになって
いますね。
282デフォルトの名無しさん:2006/03/05(日) 01:31:37
>> 280
それがあなた、スレが停滞したときに限って現れるので、
思わず相手をしてしまうのですよ。

283デフォルトの名無しさん:2006/03/05(日) 03:51:29
>>281
278です。おっしゃる通り。empty状態とput時の例外を採用すると殆どmVarになります。
mVarを一気に理解するのは難しいので、cell -> 272 -> mVar と発展させる予定でした。

284274:2006/03/05(日) 10:44:09
mVar について質問させてください

mVar は、利用者が mVar へ書き込んだ後 full 状態に遷移して
利用者が読み込む前に書き込もうとすると Ack false で例外が出るけど
仮に利用者が読み込まないと full 状態にとどまり続けますよね?

つまり、put mVar したあと、誰も take mVar しないと、永遠に put mVar が
失敗しますよね? 例えば、shareVar を mVar として、

let old = take shareVar in
let _ = put shareVar (old + 100) in
let new = take shareVar

見たいな処理は、無数のスレッドから呼ばれても整合性を保つけれど

let old = take shareVar in
let _ = put shareVar (old + 100)

だと、shareVar はずっと full で書き込み禁止になってしまいませんか?
あるいは、共有リソースは、更新したらその更新した値を参照するのが当たり前と
言うことなのでしょうか?う〜ん、こんがらがってきた・・・
285デフォルトの名無しさん:2006/03/06(月) 10:50:59
>つまり、put mVar したあと、誰も take mVar しないと、永遠に put mVar が
>失敗しますよね? 例えば、shareVar を mVar として、
それはその通りです。

おそらく、疑問の出発点は、mVarって何が嬉しいねん? という事でしょう。

mVar は「値を参照・それを元に新しい値の生成・それを書き込む」という一
連の手順を保証するのに適しています。あるスレッドが変数 m に対して

sync $$ mVar.put m $$ calc_new_value $$ sync $$ mVar.take m

したとします。仮に他のスレッドがこの処理の途中で同じような処理をしよう
としても、値が無いので、新しい値が書き込まれるまで待たされます。つまり、
「値を参照・それを元に新しい値の生成・それを書き込む」という一連の手順
は、必ず順番に行われるよう保証されます。

要は mVar は参照したら必ず更新する変数を意図しているのです。ちなみに、
272で示した「一度書き込んだら参照だけ何度も可能で、二度と書き込めない」
変数は iVar と呼ばれ、データの受渡しやStreamの実装など、幅広く使える変
数です。
286デフォルトの名無しさん:2006/03/06(月) 11:20:08
ごめんなさい、
sync $$ mVar.put m $$ calc_new_value $$ sync $$ mVar.take m
じゃなくて、
mVar.put m @@ calc_new_value @@ sync @@ mVar.take m
でした。ちなみに、@@ は、let (@@) f x = f x です。
287デフォルトの名無しさん:2006/03/06(月) 11:28:55
あっ、mVar ってモジュール名使えないじゃん。失礼しました。適当に読みか
えてください ToT
288デフォルトの名無しさん:2006/03/06(月) 18:01:15
SML# alpha release sage
289デフォルトの名無しさん:2006/03/06(月) 20:55:40
>>285
なるほど、一連の手順がスレッドセーフになることを保証する
変数を抽象化しているわけですね

ところで、mVar、iVar の それぞれ i、m って何の略なんでしょうか?
290デフォルトの名無しさん:2006/03/06(月) 21:13:03
mutable/immutable
291デフォルトの名無しさん:2006/03/06(月) 21:22:05
>>290
あ、なるほど、THXです
292デフォルトの名無しさん:2006/03/13(月) 22:21:09
厨な初心者質問で恐縮です
O'Camlで互いに呼び出し合っている様な大域で束縛された2つの関数を作りたい場合、

let rec f1 x =
 if (x <= 1) then 1
 else x * f2 (x-1)

let rec f2 x =
 if (x <= 1) then 1
 else x * f1 (x-1)

みたいに書くと「束縛されてない"f2"」を呼び出そうとしているので怒られます。
でどうしようかと悩んだのですが、

let rec f0 f1 x =
 if (x <= 1) then 1
 else x * f1 (x-1)

let rec f1 x =
 if (x <= 1) then 1
 else x * f0 f1 (x-1)

let f2 = f0 f1

みたいな書き方しか思い付きませんでした ('A`)
普通はどう書くものなのでしょうか?
293デフォルトの名無しさん:2006/03/13(月) 22:58:23
let rec f1 x =
 if (x <= 1) then 1
 else x * f2 (x-1)
and f2 x =
 if (x <= 1) then 1
 else x * f1 (x-1)
294デフォルトの名無しさん:2006/03/13(月) 23:41:09
>293 … orz

"and"の意味を思いっきり誤解しておりますた ('A`)
てっきり「同時に束縛される=束縛の式記述内でもう一方の束縛は使えない」と思っておりますた
「評価」されなければいい、ということでしょうか?

もう一つ似たような問題に悩んでいまして、互いに参照(?)しあう型定義をしたい時

type type_a = int * type_b
type type_b = int * type_a

とか出来ないので、

type 'a type_ = int * 'a
type type_a = int * type_a type_
type type_b = int * type_a

とか考えたのですが、これももっと良い書き方があるのでしょうか?
295デフォルトの名無しさん:2006/03/14(火) 00:26:41
バリアント型として定義し、andで繋いで相互再帰にする。

type type_a = ACons of int * type_b
and type_b =BCons of int * type_a ;;

ていうかこの型、終端がないじゃないか! 無限リスト?
296デフォルトの名無しさん:2006/03/14(火) 01:13:54
>295
やっぱり綺麗な書き方があるんですね orz
バリアント型をちゃんと理解できてないようなのでもう少し勉強しまつ

ちなみに上のコードは問題箇所だけに単純化して書いたので、
実際に考えていたコードは片方をバリアント型として定義して
終端させる所で終端データを束縛させています

厨な質問に相手をして戴き、ありがとうございました。
おかげでとても勉強になりました m( _ _ )m
297デフォルトの名無しさん:2006/03/14(火) 12:13:53
>>296
-rectypes オプションつけるという逃げ方もあるよん
298デフォルトの名無しさん:2006/03/14(火) 20:37:11
これも....〆(・ω・` )めもめも
299デフォルトの名無しさん:2006/03/15(水) 00:42:17
OCaml の object って多相レコードだと思っていいの?
300デフォルトの名無しさん:2006/03/16(木) 10:16:47
>>299
意味論とか詳しいことは判りませんが、let name p = p#name みたいな事がで
きるという意味では、正に多相レコードと同じですねー。
# ad-hoc とか subtype とかと言えばいいのでしょうか?
# あと、両方 parametric pol. 出来ますねー。

object で言うところの val と method の違いは mutable かどうかに対応す
るのでしょうか?

あと、object では initializer とか inherit とか便利な構文がありますが、
これは多相レコードには無さそう...?


301デフォルトの名無しさん:2006/03/16(木) 19:38:42
ねー。
か?
ねー。

か?

う...?
302デフォルトの名無しさん:2006/03/17(金) 04:17:09
なんか久しぶりに 2ch ぽいレスを見た気がする…?
303デフォルトの名無しさん:2006/03/17(金) 10:30:10
授業で扱ったSMLが楽しかったので関数型言語を勉強したいと思っているのですが、
OCamlとSML、どちらの方が人気があるんでしょうか?
また、よりいろんなことができるのはどちらになるんでしょうか?
このスレではほぼOCamlの話題で埋まってるみたいですけど…
304デフォルトの名無しさん:2006/03/17(金) 11:44:09
Ocaml の Record 宣言なんだけれども

type atype = { name : string; desc : string }
type btype = { name : string; point : int }

とか宣言して、

let get_name (x : atype) = x.name

とかすると、

This expression has type atype but is here used with type btype

とかでてしまい、atype として使えないのですが、これを
回避する方法ってないのでしょうか?
305304:2006/03/17(金) 13:34:30
あ、自己レスだけどヴァリアント型とかいうのを使えばいいのかなぁ
306デフォルトの名無しさん:2006/03/17(金) 14:18:09
宣言の順序から「name」というフィールド名が btype に対応するようになっ
ているのが原因。そういう宣言のときには atype の name にさわることはで
きない。

実際の利用局面にもよるがバリアントはレコードと違う(双対の関係にある)の
でたぶん関係ない。


多相的なレコードを OCaml でやろうと思ったら、とりあえずオブジェクトを
使えということです。
class atype (n:string) (d:string) = object
method name = n
method desc = d
end
class btype (n:string) (p:int) = object
method name = n
method point = p
end

let get_name (x : atype) = x#name


307デフォルトの名無しさん:2006/03/17(金) 14:19:57
補足すると、

let get_name x = x#name

とすると、 get_name の型は < name : 'a; .. > -> 'a になる。つまり name
というメソッドのあるオブジェクトならオーケーなので、 atype でも btype
でも get_name に適用できる。
308304:2006/03/17(金) 20:05:21
おお!まさにそれで上手く出来そうです。
ありがとうございますた。
309デフォルトの名無しさん:2006/03/17(金) 20:18:30
前々からできるのか、最近できるようになったのかは知らないけど、
let x = object method name = "taro" end;;
で直接オブジェクトが作れたりする。。
けど、これ camlp4r の改訂版構文(?)だと使えないんだよな。
ガリグさんの polymap みたいに
let x = `{ name = "taro" };;
で上の宣言に変換されるようなマクロを書こうと思ったんだが…。
なんか解決策あったら教えてくれ。
310デフォルトの名無しさん:2006/03/17(金) 22:48:42
多相レコードといえば、SML# alphaを入れてみた。
今時SML/NJの110.07なんて公式サイトをだいぶ探さないと
見つからないから難儀したぜ。
311http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 19:17:48
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
312デフォルトの名無しさん:2006/03/20(月) 23:20:49
>>310
SML# を体験してみた感想はいかが?
レコード多相やランク1多相もいいけど、Cとの連携がいけてるらしいけど、ど
んなもんかな。
IEEE 854(マージされた754でもいいけど)とかに対応してると、とっても実用
的って感じ。

313デフォルトの名無しさん:2006/03/23(木) 00:44:38
>>299
型の観点からは多相レコードと一緒。
大堀先生の多相レコードとまったく同じだと思えばいい。

>>300
細かいことだけど、多相レコードの型つけはsubtypingとは違う。
< name : 'a; .. > -> 'a
は、
∀ρ . < name : 'a; ρ > -> 'a
で、ρが適当に代入される。
多分、意味的にはParametric Polymorphismと一緒。

>>304
オブジェクト使うのも手だけど、OCamlの標準ライブラリを見た感じだと、
レコードのラベルには型名のprefixをつけてるみたいだね。
314デフォルトの名無しさん:2006/03/23(木) 13:31:04
SML/NJ触った後、どこ行けばいいの?
オキャメル?ハスケル?
315デフォルトの名無しさん:2006/03/23(木) 13:37:48
SML#
316デフォルトの名無しさん:2006/03/29(水) 02:33:44
OCamlのプログラムを書いているとき、
Visual Studioのインテリセンスのように、
コード補完や、型名の表示をしてくれるエディタが
激しく欲しいと思うのですが、みなさんはどうでしょうか。
317デフォルトの名無しさん:2006/03/29(水) 02:42:24
さあビジネスチャンスはそこに広がってるぞ!
何故自分で創らない!?
318デフォルトの名無しさん:2006/03/29(水) 04:52:58
>>316
つ F#
319デフォルトの名無しさん:2006/03/29(水) 06:19:48
F#ってもう公開されてるの?
320sage:2006/03/29(水) 10:36:37
F#、少しだけさわってみたけど、文法がOCamlと少し変わっているし、
.NETのメソッドやなんかはカリー化できない。
結局、やっぱり.NETではC#を使おうと思った。
321デフォルトの名無しさん:2006/03/29(水) 13:33:03
>.NETのメソッドやなんかはカリー化できない。
ガーン
322sage:2006/03/30(木) 02:01:03
タイプパラメータの + 'a, - 'a の +,-の意味がよくわからないです。
どなたか教えてくださいまし
323デフォルトの名無しさん:2006/03/32(土) 00:04:35
MLtonってミルティンって読むのか。
今までエムエルトンって言ってたぜぃ。
324デフォルトの名無しさん:2006/03/32(土) 00:27:59
>>323
まりがとん
325デフォルトの名無しさん:2006/03/32(土) 12:50:43
ぬるぽん
326デフォルトの名無しさん:2006/04/02(日) 12:17:02
SML#ってどうなの?
とりあえずおれに
1.ランク1多層性
2.多層型レコード演算

について、従来のMLとの違いがわかるようにおしえてくれ。

ちなみにSMLってオブジェクトはつかえるの?
327デフォルトの名無しさん:2006/04/02(日) 12:31:22
SMLでグラフィックってかける?
328ad:2006/04/02(日) 12:42:32
実は、たったの24時間で、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
あなたの今後のネット収益を倍増するスキルがあります。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
それを知りたい方は、他にいませんか?

アフィリエイトを使わずにホームページとEメールだけで3,000万以上稼いだ
インターネット・マーケッターの宮川さんが、

巨大な現金の山を作り出す門外不出の一生涯使えるノウハウを
下記のサイトで公開しています。

その内容をお知りになりたい方は、下記をクリックしてください。

【たったの24時間で あなたの今後のネット収益を倍増するスキルとは? 】
http://infostore.jp/dp.do?af=moneyclick&ip=successpreneur&pd=01
329デフォルトの名無しさん:2006/04/02(日) 18:04:06
>>326
従来のMLの多相は、多相の限量子が型式の一番外側にしか来られないが、
これを直和型(バリアント)、直積型(ペア、レコード)、関数型の値域(矢印の右側)に
一段分だけ入れ子になって表れてもいい体系がランク1多相。

ところで、MLには参照型があり、こいつを多相型と一緒にすると色々具合が悪い。
例)
val x = ref (fn x => x);  (* 'a -> 'a 型な関数への参照x *)
x := (fn x => x + 1); (* int -> int 型の関数をxに代入 *)
(!x) "string"; (* 型エラー *)

こうならないように、MLでは多相型になれる式を、定数・変数・関数式(fn x => ...)、および
これらをペアやデータコンストラクタで組み合わせた式に制限している。

しかし、この制限によって、明らかに多相型を与えても問題無いような式も制限されて
しまうことがある。
例)
fun f x y = (x, ref y);  (* 'a -> 'b -> 'a * 'b ref  *)
f 1;  (* 'b -> int * 'b ref になりそうな気がするが (f 1) には多相型がつけられない *)

ランク1多相ならば、 f に∀'a.'a -> (∀'b.'b -> 'a * 'b ref)、(f 1) に∀'a .'a  -> int * 'a ref
みたいな型をつけることができ、この制限を大幅に緩和することができる。
330デフォルトの名無しさん:2006/04/02(日) 18:28:31
次に多相レコード。

普通のMLのレコードは、#name などとすると、レコードからnameフィールドの値が取り出せるわけだが、
このレコードの型はコンパイル時に完全に決まっていなくてはならず、nameフィールドを持つレコード型なら
何でもOKというものではない。
多相レコードでは、例えば fun name x = #name x みたいな関数を定義すると、{ name=3, ... } だろうが
{ ... , name=1.5, ... } だろうが { ..., name="hoge" }  だろうが、nameフィールドを持つレコード型全てに使える。
しかも、レコードの何番目のフィールドを取り出せばよいかは、コンパイル時における型の単一化プロセスで
静的に決定するので、実行時にサーチするオーバーヘッドもない。
331デフォルトの名無しさん:2006/04/02(日) 20:15:48
(∀'b ←顔文字
332デフォルトの名無しさん:2006/04/03(月) 06:51:58
ホウ!
じゃ、
∀'a.'a -> (∀'b.'b -> ∀'c.'a * 'b ref * 'c) みたいなのはランク1じゃなくなるってこと?
333デフォルトの名無しさん:2006/04/03(月) 07:36:06
MLの王者は何言語?
Haskell
334デフォルトの名無しさん:2006/04/03(月) 07:49:51
>>333
総括する言語として作られた、という意味に置いては。
335デフォルトの名無しさん:2006/04/07(金) 21:21:56
fold_left の折り畳みを回数制限つきで実行させる fold_left_count
を実装するとして、みなさんはどうやって実装しますか?

fold_left_count (fun a b->a+b) 0 [1;2;3;4] 3

としたら3回だけ畳み込んで、1+2+3を計算してくれる、みたいな
そもそもそんな関数作らずに〜しろ、とかそういうのでもいいです
336デフォルトの名無しさん:2006/04/07(金) 23:38:54
MLの具体構文を忘れたのでHaskell風に

fold_left_count f a xs n = foldl f a (take n xs)
337デフォルトの名無しさん:2006/04/08(土) 00:04:35
おれもそう思ったんだが OCaml って take 相当の関数ある?
ExtLib 入れないとない気がする。
自分で定義してもさほど面倒ではないが……。

あと (fun a b -> a + b) は (+) と書く方が普通じゃないかな。
338デフォルトの名無しさん:2006/04/09(日) 08:52:10
Haskell のことはよくわからないけれど・・・
take っていうのは、呼ばれた回数をどこかで管理しなくちゃいけないよね
なんか、裏で副作用を伴うカウンタを持たせてるって事?
339デフォルトの名無しさん:2006/04/09(日) 10:13:29
無論、副作用を使っても良いかもしれないが、

let rec take n xs = match n, xs with
| 0, _ | _, [] -> []
| n, _ when n < 0 -> []
| n, x::xs -> x :: take (n-1) xs

とかいう風にやるのが普通だと思う。
340デフォルトの名無しさん:2006/04/09(日) 10:19:02
ああ、なるほど!
やばい、俺頭固いわ
ありがとう >>339
341デフォルトの名無しさん:2006/04/09(日) 15:35:32
ExtLibだとtakeは末尾再帰になってるね。
外部関数よんで実現しているが。
342デフォルトの名無しさん:2006/04/09(日) 17:04:48
Haskellの場合、末尾再帰にしてもそれほどうれしくないし
lazy listとの直観的な対応として>>339みたいにやるのが一番おさまりがいいのだ。

ExtLibのtakeは頭から取っていった要素を中間リストに破壊的appendすることによって
末尾再帰にしている。
Schemeのset-cdr!みたいなのを外部関数使わなきゃ実現できないってのがかっこわるいが。
343デフォルトの名無しさん:2006/04/09(日) 18:53:26
破壊、かっこ悪い
344デフォルトの名無しさん:2006/04/09(日) 19:16:34
外から見て関数的なら内側に破壊的操作が含まれていることの何が問題なのか?
345デフォルトの名無しさん:2006/04/09(日) 19:33:35
今気づいたが、よく見るとこの take というのは、SICP で見た
いわゆるStream というものと同じですね
346デフォルトの名無しさん:2006/04/10(月) 05:18:29
>>344
ファーストクラスの継続があるとまずいよ。
347デフォルトの名無しさん:2006/04/10(月) 09:53:17
>> 346
よく分からんけど、マルチスレッドでも問題になる?
348デフォルトの名無しさん:2006/04/10(月) 17:18:34
>>347
いや、一回しか再開しないなら問題ない。複数回再開する場合
前回の実行でローカルな状態に加えた変更が影響することがある。
349デフォルトの名無しさん:2006/04/15(土) 17:22:06
(fun a b->a+b) は (+)

では、

(fun x->x)

はなんて書いたらいい?
350デフォルトの名無しさん:2006/04/15(土) 22:36:42
?
そのままじゃ
351349:2006/04/15(土) 23:23:16
・・・あれ?
自分でも何でこんな質問したのか思い出せないw
なにを疑問に思ったのだろう?
352デフォルトの名無しさん:2006/04/16(日) 13:25:53
object is poormans closer!!!!!!!!!!!!
353デフォルトの名無しさん:2006/04/16(日) 17:48:26
>>352
何回もコピペされてはるけど、closer じゃなくて closure じゃないの。
354デフォルトの名無しさん:2006/04/20(木) 22:01:49
マニュアルにはinfix symbolsは左結合ってかいてあるのに、
# let (@@) f x = f x;;
val ( @@ ) : ('a -> 'b) -> 'a -> 'b = <fun>
# List.iter @@ (fun _ -> ()) @@ [];;
This expression has type unit but is here used with type 'a -> unit
とうように
(List.iter @@ (fun _ -> ()) @@ []
でなくて、
List.iter @@ ( (fun _ -> ()) @@ [])
となってしまうのはどうして?
355デフォルトの名無しさん:2006/04/21(金) 00:10:29
>354
どこのどのマニュアルの話?
http://caml.inria.fr/pub/docs/manual-ocaml/manual015.html
の表を見ればわかるが、中置記号は先頭あたりの記号の種類で結合方向が決ま
る。 @ から始まる記号は右結合。
356デフォルトの名無しさん:2006/04/21(金) 00:58:13
> 355
orz そのとおりでした。
357デフォルトの名無しさん:2006/04/22(土) 08:38:56
OCamlを勉強し始めたところですが、最近ではHaskellが人気のようです。
そこで、OCamlとHaskellとを比較したページとかはありませんか。
自分で調べた限りではこんな感じでした。
OCaml - 非純粋関数型、遅延評価なし、
Haskell - 純粋関数型、遅延評価あり、モナド?
どなたか、より詳しい比較(使い勝手とか速度とかメモリ使用量とかライブラリとか)をしてないでしょうか。
358デフォルトの名無しさん:2006/04/22(土) 08:52:52
>357
それ、自分も知りたい。
Haskellは純粋関数型だから副作用のある関数が作れないんじゃない?
だとしたらけっこう実用になるプログラムを書くのが難しそう。
どうなの?そこんとこ。
359デフォルトの名無しさん:2006/04/22(土) 10:22:02
>>357
それって2chだけの話だろ?ww(俺は元OCaml工作員)
前からHaskellの方が人気だよ
360デフォルトの名無しさん:2006/04/22(土) 11:29:41
OCaml だってやろうと思えば遅延評価はできる。デフォルトがどちらかという
話。 OCaml で遅延評価ばりばりのコードを書くのはちと大変。

また、 Haskell だって副作用のある関数が書ける。しかしふつうの関数とは
違うので、実際のコードでやるのは面倒くさい。

ふつうに書くなら、 OCaml の方が速い。ライブラリは、 Haskell の方が汎用
的なデータ構造ライブラリは揃っている気がするが、一般的によく使うライブ
ラリは OCaml の方が若干、揃っている。メモリ使用量は比べたことないな。
361デフォルトの名無しさん:2006/04/22(土) 12:16:04
そもそも文字列ですら文字リストなわけで・・その分・・
362デフォルトの名無しさん:2006/04/22(土) 12:34:24
http://d.hatena.ne.jp/tanakh/20040725#p2
ここによると一文字20バイトだそうだ。
363357:2006/04/22(土) 18:44:43
どうもありがとうございます。
>>358さんがかいているように、実用になるプログラムが書きやすいかどうかは非常に興味あります。
関数型言語の本を読むとたいがい数学チックな例題ばかりで、例えばWebアプリのようなものは見受けられません。
数学チックなものはたしかに関数型言語では書きやすいのですが、
ファイルやネットワークのような入出力、あるいはデータベース処理とかいったところが
どうなのかなと思っています。
そこらへんでの、OCamlとHaskellとの比較があればうれしいですねー。

>>360-362
なるほど。メモリ使用量はHaskellのほうが多いみたいですね。
Webアプリだと数値計算はほとんどなくて文字列処理ばかりなのですが、
それだとHaskellの富豪ぶりはちょっと問題ですね。
参考になりました。ありがとうございます。
364デフォルトの名無しさん:2006/04/22(土) 18:51:05
>>363
っ ttp://www.informatik.uni-freiburg.de/~thiemann/WASH/


関数型言語「懐疑派」は、実用的なサンプルが示されないと
ひとしきり文句言って、示されたら示されたで、「それは他の言語でもできる」だの
「そのシステムを作った人間の能力が高いのあって、関数型言語の能力の高さを
証明するものではない」だの

って、なんでここでHaskellの話になってんだ。
365デフォルトの名無しさん:2006/04/22(土) 18:53:24
あっ>>364の愚痴の部分は別に>>363さんに言ってるんじゃないからね
366デフォルトの名無しさん:2006/04/22(土) 18:59:15
っていうか、関数型言語関連のスレ住人ってほとんどかぶってるんじゃないかな。
MLとかHaskellとかLispとかetc..を分ける必要はあるのかな・・
367デフォルトの名無しさん:2006/04/22(土) 19:16:55
何となくLISPは他とかぶってない気がする
368デフォルトの名無しさん:2006/04/22(土) 19:20:56
>>366
いちよ、統合スレはあるんだけどね...

関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
369デフォルトの名無しさん:2006/04/22(土) 19:50:42
以下、順次リストのお尻に処理結果を繋げていく処理ですが、
どちらが速度面、メモリ面で好ましいのですか?
前から疑問に思ってたもので・・・

@ 「::」で繋いで、最後に逆さまにする
let hoge f list =
let rec iter = function
| h :: tl -> (f h) :: (iter tl)
| [] -> []
in
List.rev (iter list)

A 「@」で即座に後ろに繋げていく
let hoge f list =
let rec iter = functoin
| h :: tl -> [f h] @ (iter tl)
| [] -> []
in
iter list
370デフォルトの名無しさん:2006/04/22(土) 19:56:03
>>369
1はO(n)、2はO(n^2)
371369:2006/04/22(土) 20:14:47
すいません、どなたか、できればkwsk
372デフォルトの名無しさん:2006/04/22(土) 20:19:33
>>371
実際にどれだけ時間がかかるかは色んな細かい条件に依存するけど、確かな事として、
・1はおおまかに入力の長さに比例する時間がかかる
・2はおおまかに入力の長さの2乗に比例する時間がかかる
よって、入力が十分大きい場合、1の方が速い。
373369:2006/04/22(土) 20:22:46
2は、お尻に繋げるときに、毎回連結リストの最後を探しに行くので
n^2 見たいな事でしょうか?こっちはなんとなくわかります。

でも1の、リストの反転って、すばやくできるんでしょうか?
374デフォルトの名無しさん:2006/04/22(土) 21:23:55
>>373
リストの反転はO(n)で出来る
let reverse ls =
  let rec rev ls = function
  | [] -> ls
  | x::xs -> rev (x::ls) xs
  in rev [] ls 
375369:2006/04/22(土) 21:32:50
ありがとうございます!
そうか、リストの反転がO(n)ということなんですね
「::」はO(1)なんですね、ただつなげるだけですもんね
すこし恥ずかしい勘違いをしてました。
O(n) という言葉を最近覚えたことがバレてしまうorz
スレ汚しすみません
376デフォルトの名無しさん:2006/04/22(土) 21:43:44
>>369
つ List.map
というか(1)のやつ最後に反転させる必要が無いような気が。
377369:2006/04/22(土) 21:57:18
>>376
う!!!
その通りですた・・・

今回のは、例えば末尾再帰にして、
結果を引数にストックしていくような処理を書くときに

let rec hoge f ret list =
let rec iter ret = function
| h :: tl -> iter ((f h) :: ret) tl
| [] -> ret in iter [] list

こんなときに、リストのそれぞれに処理した結果を元のリストの順で
並べたいとき、上の例だと ret を反転させないといけないじゃないっすか
でも確かに map というのがそのためにあるんですねorz
いや、知らないって怖いです、本当に・・・
378デフォルトの名無しさん:2006/04/23(日) 02:09:20
>>362
Haskellって文字列がばかでかいみたいだけど遅延評価があるからなんとかなっているんでしょ?
379デフォルトの名無しさん:2006/04/23(日) 02:26:08
確かに遅延されてるうちはいいが、ひとたびリストをたぐっていくと
そのそばからキャッシュしていってメモリを食う。
foldl系の関数を作って値をまとめてるつもりでも、その演算すら遅延されるから
簡約グラフがリストと同じような形で残り続ける。
380デフォルトの名無しさん:2006/05/04(木) 13:13:02
>>364
まあ、言語には向き不向きがあって、
関数型言語は実用的なアプリケーションの作成には、不向きってことでいいの?
OCamlがコンパイラ書くのに使う以外みたことなかったりするのも、
それが原因ですか?
381デフォルトの名無しさん:2006/05/04(木) 18:43:32
たしかに言語自体に向き不向きなアプリケーションがあるけど、
大部分のアプリケーションは、CやJavaで書くのも、関数型言語で書くのも大差ない。
それより、ライブラリや、ネイティブコードを吐けるコンパイラなど、
開発環境が整っていないのが大きいと思う。
382デフォルトの名無しさん:2006/05/07(日) 14:02:47
>>379
それを防ぐために`seq`があるわけだが
383デフォルトの名無しさん:2006/05/07(日) 14:31:51
結局、関数型のプログラミングスタイルというのはプログラミングスタイルの一部で
しかなく、関数型で簡単に書けるところは関数型で書き、命令型で簡単に書けるところは
命令型で書くというのがいいんじゃないかなと、最近思う。
言語としては、この両者を自然に行き来できるものが最高だろうと思う。
384デフォルトの名無しさん:2006/05/07(日) 14:34:32
つまりOCaml最強ということですね?;-)
385デフォルトの名無しさん:2006/05/07(日) 14:39:40
MLやHaskellやSchemeはその両者間の行き来が十分に自然じゃないってこと?
386デフォルトの名無しさん:2006/05/07(日) 15:40:39
OcamlはMLだよねえ
Haskellは命令型で自然に書けない
Scheme(Lisp)はCurry化が無い
387デフォルトの名無しさん:2006/05/07(日) 16:09:06
>>386
>>385>>383へのレス

>Haskellは命令型で自然に書けない
よくわからん。Haskellではdo記法のおかげで
MLと大差なく自然に命令型のプログラミングができると思うんだが。
>Scheme(Lisp)はCurry化が無い
カリー化と命令型プログラミングにどういう関係がある?
388デフォルトの名無しさん:2006/05/07(日) 16:31:44
>>387
Haskellは副作用を自由に使えないよね.
両方使ってみた実感としてHaskellよりML(Ocaml)の方が
はるかに命令型プログラミングは楽.
あとSchemeの方は,Curry化がないので関数型プログラミング
しにくいってことね
389デフォルトの名無しさん:2006/05/07(日) 16:37:44
>>388
なるほど、回答ありがとう。
390デフォルトの名無しさん:2006/05/07(日) 17:03:14
そんなことどうでもいいから最強言語スレにでもいけや
391デフォルトの名無しさん:2006/05/08(月) 19:52:47
392デフォルトの名無しさん:2006/05/12(金) 13:41:24
WEBで拾ったPDFでラムダ計算を勉強しようと思ったのですが、
その中で、タプルを

(e1,e2) = λc.c e1 e2

と表現できて、

match e1 with
(f,s) -> e2



e1(λf.λs.e2)

を表しているそうなのですが、なぜこうなるのか、これが何を意味するのかが???です。
参考にしたのは、
ttp://www.kb.ecei.tohoku.ac.jp/~sumii/class/keisanki-software-kougaku-2005/lambda.pdf

です。
識者の人 智恵を貸して下さい。
393デフォルトの名無しさん:2006/05/12(金) 19:16:48
>>392
実際に簡約してみればすぐわかる。

(λc.c e1 e2) (λf.λs.e3) -> (λf.λs.e3) e1 e2
394391:2006/05/12(金) 21:45:04
>>393
ありがとうゴザイマス。何となくわかったような気がするんですが
一応、勘違いしていないか確認させてください

x = (e1,e2) として、
match x with (f,s) -> e3



(λc.c e1 e2)(λf.λs.e3)
-> (λf.λs.e3) e1 e2
-> e3

ということなんですか?
395デフォルトの名無しさん:2006/05/13(土) 21:20:11
要するにJAVAにファーストクラスのメソッドなり関数を入れれば
それが最強だということジャン。
396デフォルトの名無しさん:2006/05/13(土) 23:08:16
え?なんで?
397デフォルトの名無しさん:2006/05/13(土) 23:14:17
Java からクロージャを外したのは言語デザイン上の選択だから、今さら入らないでしょ。
398デフォルトの名無しさん:2006/05/13(土) 23:49:48
2つのリストの要素のあらゆる組み合わせを得る関数
(たとえば
func [1;2;3] [1;2;3]
=> [(1,1);(1,2);(1,3);(2,1);(2,2);(2,3);(3,1);(3,2);(3,3)]
のようなの)
を作ったら、どういう名前をつけるのが適当でしょうか?
399デフォルトの名無しさん:2006/05/13(土) 23:59:28
おれなら、allElemPairList_of_2list
だね。
400デフォルトの名無しさん:2006/05/14(日) 00:51:56
そゆんじゃなくて、タームがあるといいんですが。
日本語だと総当たりみたいな。
full_combine ぐらいかなあ。

401デフォルトの名無しさん:2006/05/14(日) 01:07:19
jibunndetukuranaikagirisonnnabakagetakannsuunita-munanntearuwakene-daro,konobokega
402デフォルトの名無しさん:2006/05/14(日) 01:20:24
>>398
cartesianProduct。
403デフォルトの名無しさん:2006/05/14(日) 01:21:33
>>398
クラス名・変数名に迷ったら書き込むスレ。Part7
http://pc8.2ch.net/test/read.cgi/tech/1144978008/
404デフォルトの名無しさん:2006/05/14(日) 01:25:14
>>402 それだと、あまりにアバウト杉
405デフォルトの名無しさん:2006/05/14(日) 14:12:38
そうか?
406デフォルトの名無しさん:2006/05/14(日) 14:53:30
がっかい
407デフォルトの名無しさん:2006/05/14(日) 16:59:03
direct_product
408デフォルトの名無しさん:2006/05/15(月) 10:12:16
>>398
permutation
409デフォルトの名無しさん:2006/05/15(月) 14:13:34
さすがにそれは違うだろ。
410デフォルトの名無しさん:2006/05/16(火) 00:18:37
O'Camlの対話環境で、現在の状態(環境)を保存したり復元したりすることはできるのでしょうか?

スナップショットが持ち運べると便利かなぁと
411デフォルトの名無しさん:2006/05/16(火) 14:45:41
無いと思います。
412デフォルトの名無しさん:2006/05/17(水) 02:34:47
そうすか、ちゃんと纏めてないとダメすか

tuareg-run-ocamlのHistoryを纏めて保存する機能とかないのかなぁ…
413デフォルトの名無しさん:2006/05/17(水) 21:56:18
>410

#!/usr/bin/perl

open OUT, "> temp" or die "Cannot create file";
$| = 1;

while (<STDIN>) {
if (/\s*\#quit\s*;;/) { last; }
print OUT $_;
print;
}

close OUT;

とか適当に入力を記録するスクリプト書けば、入力したものはファイルに残せる。
エラーが起こる入力も含めてだけど。
414デフォルトの名無しさん:2006/05/17(水) 22:06:18
↑ をパイプでつないで対話環境を実行ね。
415デフォルトの名無しさん:2006/05/17(水) 22:35:12
$| = 1;

は必要なん?
416デフォルトの名無しさん:2006/05/17(水) 23:10:46
そんなら script 使えばいいのでは。

tuareg-mode の run-ocaml を使ってるなら、バッファの内容を全選択→コピー
→適当に編集して保存、てのはだめ? っていうかそれが面倒という話?
417デフォルトの名無しさん:2006/05/18(木) 23:24:39
>413-414

参考にさせて頂きます m( _ _ )m

>416

おっしゃる通りで、それも検討致しました。
結局は非対話的部分をファイルに書いて、対話環境で「#use "hoge.ml";;」てな感じで反映させてます。
なんかもっと良い方法がないものかと思いまして質問致した次第です。
418デフォルトの名無しさん:2006/05/21(日) 23:12:19
ocamlsdlがやっと動いたー
苦労させすぎ
419デフォルトの名無しさん:2006/05/22(月) 00:46:46
ごめんねー、お父さんさえ元気でいてくれたら、お前にこんな苦労(ry
420デフォルトの名無しさん:2006/05/22(月) 01:04:54
Debian使えば(ry
421418:2006/05/22(月) 05:28:13
だめだー
SDLとOpenGLを同時に使おうとするとビルドできない
それぞれ単体だといけるのに
422デフォルトの名無しさん:2006/05/22(月) 19:18:36
>>418
関係ないけど、OS何?Windows?
だとしたら、手順をまとめてくれるとうれしいな
423418:2006/05/22(月) 21:32:25
環境は、winXP + OCaml-3.09.0-msvc + ocamlsdl-0.7.2 + SDL-1.2.10。

手順はだいたいINSTALL.win32のとおり。
それとは違う、工夫が必要だった点は、

〜ビルド時〜
・makefile.config.msvcの下のほうにある、
 MKCMXA = $(OCAMLOPT) -a -o $(1).cma〜 を
 MKCMXA = $(OCAMLOPT) -a -o $(1).cmxa〜 に変更する。

・makefile.config.msvcの下のほうにある、
 MKCLIB = lib /out:lib$(2).$(A) $(3) を
 MKCLIB = link /lib /out:lib$(2).$(A) $(3) に変更する。
 INSTALL.win32にはlib.batを作れとあるが、代わりにこうする。

(続く)
424418:2006/05/22(月) 21:34:15
〜ビルド後〜
・libsdlloaderstub.lib、libsdlmixerstub.lib、libsdlstub.lib、
libsdlttfstub.libをリネームする。
どのように変えるかはコンパイルエラーを参考にすべし。

・DLLの方のSDL.libとocamlsdlのSDL.libがかち合うので、DLLの方の
ライブラリパスを先に書く。

・デフォルトライブラリがかち合うので、
-cclib "/link /NODEFAULTLIB:msvcrt.lib"
を指定する。

これで、ttp://shinh.skr.jp/testsprite/ のOCaml用ソースが
コンパイルできて動いた。

と、ここまではよかったのだが、ocamlglと併用しようとすると
ビルドがうまくいかない。
どうにもならなかったので、Cygwin + MinGW 用のOCamlで挑戦してみたが、
こっちはライブラリのビルドすらうまくいかなかった。

こちらの現状をこんなところ。あともうちょいのところでうまくいってない。
425デフォルトの名無しさん:2006/05/23(火) 10:06:37
ここに書いてあるOCamlのまともな問題の100%がJavaで解決できる件について
426デフォルトの名無しさん:2006/05/23(火) 13:39:09
小回りのきかない、めんどくさい、糞言語 → Java
427デフォルトの名無しさん:2006/05/23(火) 16:07:30
食い付くなよ
428デフォルトの名無しさん:2006/05/23(火) 18:15:22
>>426
MLはバグが出にくいのがとりえだと思ったんだが・・
429デフォルトの名無しさん:2006/05/26(金) 13:16:36
>> 423
makefile.config.msvc の MKCMXA の所で .cma と typo したまま
リリースしている時点で、 ocamlsdl の作者は windows でのテストは
まじめにやってないんじゃないかと、、、

こういう外部ライブラリインターフェース系はほとんど linux で開発が
行われていて、windows へのポートはあまりサポートされておらず、
サポートされているように見えても、実は地雷原になっているという
一般的印象があります。開発者が windows に興味を持ってない場合
どうしようもないけど。

とりあえず linux で ocamlgl + ocamlsdl をやってみて動いたら
windows へ、というのはどうですか?
430デフォルトの名無しさん:2006/05/27(土) 08:18:26
ocaml で ifdef みたいなのってどうやるの?
431デフォルトの名無しさん:2006/05/27(土) 09:11:00
camlp4 で pa_macro 使え
432デフォルトの名無しさん:2006/05/27(土) 18:23:17
>>431
THX!!
camlp4 ってのはなんだか凄そうですね
pa_ifdef ってのがあるみたいですけど、これ使えばいいのかな
でも何となく使い方はわかった
けど camlp4 の書き方とかは難しそうだな
433デフォルトの名無しさん:2006/05/27(土) 20:06:15
m4を知らずにぼくらは生まれた
434デフォルトの名無しさん:2006/05/27(土) 22:09:04
caml 文字列の連結って遅い?コピーとか発生するの?
435デフォルトの名無しさん:2006/05/27(土) 23:55:44
文字列はmutableなのでコピーは不可欠
436デフォルトの名無しさん:2006/05/28(日) 00:31:29
じゃあ、"aaa" ^ "bbb" だと、
6文字分の新規領域を作って、そこに6文字コピーするってこと?
でっかい文字列を効率よく連結したいときは、Buffer とか使うの?
437デフォルトの名無しさん:2006/05/28(日) 01:10:56
連結の数が多いときBufferを使う。
一回の連結の時どちらが早いかは自分で調べてくれ!
438デフォルトの名無しさん:2006/05/28(日) 01:24:59
>>436
> そこに6文字コピーするってこと?

それは実装による。

439デフォルトの名無しさん:2006/05/28(日) 01:31:59
ありがとう。
今でっかい文字列を扱う処理を書いていて、色々と切り取った文字列を
リストに貯めておいて最後に連結、みたいな処理書いていたんだけど
これってBufferつかったら速くなりそうだ。
440デフォルトの名無しさん:2006/05/28(日) 02:03:22
Ocamlで書いたプログラムをJavaのプログラムに組み込むのって
どうやってやればいいのですか?
441デフォルトの名無しさん:2006/05/28(日) 19:05:43
なんか定番的なOcaml本ってないですか?英語可
442デフォルトの名無しさん:2006/05/28(日) 19:39:59
443デフォルトの名無しさん:2006/05/29(月) 06:56:27
444デフォルトの名無しさん:2006/05/29(月) 08:14:54
>>443
>442
445デフォルトの名無しさん:2006/05/29(月) 08:40:14
ファンクターという概念が未だによく理解できません
数学的にもOcaml 的にも。
ズバっと理解できる単純な説明はありませんか?
446デフォルトの名無しさん:2006/05/29(月) 08:46:35
447デフォルトの名無しさん:2006/05/29(月) 11:59:27
ところで、pa_extend とかの pa って何の略? pattern ?
448デフォルトの名無しさん:2006/05/29(月) 17:21:20
pa は parser。 pr が printer
449デフォルトの名無しさん:2006/05/29(月) 18:03:50
dクス
450デフォルトの名無しさん:2006/05/31(水) 00:52:34
数学的にどうとかは知らんけど、
ファンクターってモジュールを返す引数付きのモジュールでそ。
モジュール関数みたいなもの?
んで、引数にはモジュールもファンクターも取れるので、高階らしい。

そういえば、第一級のモジュールを実装って話はどうなったんだろう。
451デフォルトの名無しさん:2006/05/31(水) 16:21:40
>>450
なるほど。かなりスッキリしますた。
452デフォルトの名無しさん:2006/05/31(水) 16:34:31
ファンクターでぐぐったら、こんな感じの説明があった
ttp://www.math.kochi-u.ac.jp/katsumi/kenkyu-ama.html

カテゴリーとして「日本国民」があって、これから別のカテゴリー「日本の人口」
を対応させるために選ぶファンクターが「国勢調査」なのだそうです
なんとなくわかったような
453デフォルトの名無しさん:2006/05/31(水) 18:43:20
>>452
その説明だと関数とファンクターの差がわからない気がする。
準同型写像になる良い例があるといいのだが。
454デフォルトの名無しさん:2006/05/31(水) 19:55:27
>>453
準同型写像になる良い例、というのを漏れにもわかる喩え話しでキボンヌ

それと、Ocaml でファンクターっていうときに、
モジュールに与える引数をファンクターっていうのか
あるいはそういう引数を取れるモジュールをファンクターっていうのか
どうにも混乱するのだが実際はどっちなの?
455デフォルトの名無しさん:2006/05/31(水) 21:50:04
漏れw
キボンヌw
456デフォルトの名無しさん:2006/05/31(水) 23:43:38
>>454
後者でしょ。で、前者の引数にファンクターも指定できる。
457デフォルトの名無しさん:2006/06/01(木) 00:12:35
map
458デフォルトの名無しさん:2006/06/04(日) 17:06:04
ML初心者です。
SML/NJで遅延評価ってできますか?
Webで読める資料とかあったら教えてください。
459デフォルトの名無しさん:2006/06/04(日) 17:20:11
>>458
SMLは遅延評価してません
460デフォルトの名無しさん:2006/06/04(日) 17:41:50
>>459
ttp://wiki.ocaml.jp/index.php?%B4%D8%BF%F4%B7%BF%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3%2F%C3%D9%B1%E4%C9%BE%B2%C1
ここの記述を読んで期待したんですが、無理ですか…
OCamlでも試してみようかな。
461デフォルトの名無しさん:2006/06/04(日) 17:48:03
ぐぐったらLazySMLとかSMLofNJ.Suspとかいろいろ見付かるんだが、これは違うの?
462デフォルトの名無しさん:2006/06/04(日) 18:22:27
>>461
少なくともSMLとは違うのものではないでしょうか。
463デフォルトの名無しさん:2006/06/04(日) 18:32:40
元が SML/NJ でって書いてあるから、良いんじゃないの。
464458:2006/06/04(日) 19:19:18
>>461
ググってみました。
全部英語ですね…
頑張って読んでみます。
465デフォルトの名無しさん:2006/06/04(日) 23:01:46
日本語の資料を期待していたらしい時点で
>>458は相当の素人だと推測できる。
466デフォルトの名無しさん:2006/06/05(月) 03:15:05
(* Susp -- support for lazy evaluation *)

type 'a susp

val delay : (unit -> 'a) -> 'a susp
val force : 'a susp -> 'a

(*
['a susp] is the type of lazily evaluated expressions with result
type 'a.

[delay (fn () => e)] creates a suspension for the expression e.
The first time the suspension is forced, the expression e will be
evaluated, and the result stored in the suspension. All subsequent
forcing of the suspension will just return this result, so e is
evaluated at most once. If the suspension is never forced, then e
is never evaluated.

[force su] forces the suspension su and returns the result of the
expression e stored in the suspension.
*)
467デフォルトの名無しさん:2006/06/10(土) 22:29:12
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc63
ここの無限リストについて、
「ヴァリアント型をわざわざ使わずに,要素と関数の組で表現することも原理的に可能である」
ってあるんですけど、実際にヴァリアント型を使わずに書くにはどう書いたらいいんですかね。
468デフォルトの名無しさん:2006/06/11(日) 00:01:18
>>467
# let rec from n = (n, fun () -> from (n + 1));;
# let head (x, _) = x;;
# let tail (_, f) = f ();;

単にこうゆうことじゃない?
469デフォルトの名無しさん:2006/06/11(日) 00:48:47
Ocaml 3.09.0ですが、こうなっちゃいます。

# let rec from n = (n, fun () -> from (n + 1));;
Characters 17-44:
let rec from n = (n, fun () -> from (n + 1));;
^^^^^^^^^^^^^^^^^^^^^^^^^^^
This expression has type int * (unit -> int * (unit -> 'a))
but is here used with type int * (unit -> 'a)
470468:2006/06/11(日) 03:30:15
>>469
-rectypes オプションで動かしてると大丈夫
471デフォルトの名無しさん:2006/06/11(日) 07:09:24
ほんとだ。どうもありがとう

>-rectypes
> 型チェックの際、任意の再帰的な型を許します。デフォルトでは、オブジェクト型を経由する再帰による再帰的な型しかサポートされません。
472デフォルトの名無しさん:2006/06/12(月) 11:52:07
関数型言語を勉強するのは蟻
手続き型言語で十分だと言ってる奴はキリギリス
473デフォルトの名無しさん:2006/06/12(月) 11:55:18
誤爆
474デフォルトの名無しさん:2006/06/12(月) 13:16:17
むしろ手続きのほうが蟻な気がす。
475デフォルトの名無しさん:2006/06/12(月) 18:33:29
関数型言語を勉強する奴は犬
手続き型言語で十分だと言ってる奴は猫
476デフォルトの名無しさん:2006/06/12(月) 19:02:55
関数型言語を勉強するやつは淫乱
手続き型言語で十分だと言ってるやつは淫売
477デフォルトの名無しさん:2006/06/12(月) 21:10:02
むしろ手続きのほうが犬な気がす。
478デフォルトの名無しさん:2006/06/12(月) 22:31:21
>>477
サンダルの愛し方で犬だろう←関数型
479デフォルトの名無しさん:2006/06/13(火) 01:30:43
# let rec f = 1 :: f;;
とかやると、
val f : int list = [1; 1; 1; 1; 1 ...]
っていう無限リストができるけどこれって何に使えるんでしょうか?
480デフォルトの名無しさん:2006/06/13(火) 04:36:35
通常の再帰関数だと停止させるための条件を書かないといけないが、
無限リストだと、takeとかnthで簡単に取り出せる
とか言ってみるテスト
481デフォルトの名無しさん:2006/06/13(火) 08:24:20
でも例えば
let rec f x = 1 :: f (x + 1);;
これが[1; 2; 3; ...]っていう無限リストになるんなら使い道はありそうだけど
Ocamlで普通のリスト(takeとかが使える形の)で無限リストができるって>>479みたいなものだけですよね。
482デフォルトの名無しさん:2006/06/13(火) 08:37:10
質問の本質的意図を明確に
483480:2006/06/13(火) 19:52:43
>>481
少し勘違いしてた。確かに、
> let rec f x = 1 :: f (x + 1);;
このタイプの無限リストは使えない。

でもlazyを使えば、遅延リストとして無限リストが実装できて、
そっちの方が頭の中にあった。

ttp://www.jmuk.org/d/?path=2005/03/24
ここにLazyListというのがあって、それを使えばフィボナッチ数列のコードが
let fib () =
 let rec loop a b =
  LazyList.lcons a (lazy (loop b (a + b)))
 in
 loop 0 1

let _ =
 print_int (LazyList.nth (fib ()) 25)

というように書ける。
484480:2006/06/13(火) 19:54:23
ちなみに、zip_withという関数を自分で書くと、こんな風に書くこともできる。
open LazyList

let rec zip_with f l1 l2 =
 lcons (f (hd l1) (hd l2)) (lazy (zip_with f (tl l1) (tl l2)))

let rec fib () =
 lcons 0 (lazy (lcons 1 (lazy (zip_with ( + ) (fib ()) (tl (fib ()))))))

let _ =
 print_int (LazyList.nth (fib ()) 25)

上記のコードは、このHaskellのコードを直訳したもの。
main = print $ last $ take 25 fib
 where
  fib = 0 : 1 : zipWith (+) fib (tail fib)
485480:2006/06/13(火) 19:56:08
さらに、Camlp4を使って演算子を定義してやると、
open Pcaml

EXTEND
expr: AFTER "+"
[RIGHTA [x = expr; "+:"; xs = expr ->
<:expr< lcons $x$ (lazy $xs$) >> ]];
END

-------------------------------------------------
open LazyList

let rec zip_with f l1 l2 =
 f (hd l1) (hd l2) +: zip_with f (tl l1) (tl l2)

let rec fib () =
 0 +: 1 +: zip_with ( + ) (fib ()) (tl (fib ()))

let _ =
 int_int (LazyList.nth (fib ()) 25)

と書けたりする。
486デフォルトの名無しさん:2006/06/13(火) 22:42:41
>>482
いやまあ割りと素朴な疑問の類で、
[1; 1; 1; 1; 1 ...]
これが ...] で終わる表示になったり、Stack overflow during evaluationにはならなかったりするのは
なんか OCaml の中でわざわざ特別扱いをしてあげてるんですよね。
そういう設計判断の動機って何なのかな、何かにうまいこと使えるのかな、っていう疑問です。
487デフォルトの名無しさん:2006/06/13(火) 23:16:14
>486
単にリストが長いときには表示をはっしょってるだけ。
List.length とかを呼ぶと止まらない。
488デフォルトの名無しさん:2006/06/15(木) 17:38:53
>483-485
見事にスルーされてるな
君はお呼びじゃなかったってことだ(藁
489デフォルトの名無しさん:2006/06/15(木) 18:42:36
>>488
自演乙
490デフォルトの名無しさん:2006/06/15(木) 19:53:54
馬鹿丸出しw
491デフォルトの名無しさん:2006/06/15(木) 20:34:39
>>488
氏ね
492480:2006/06/15(木) 20:49:47
ワラタ
493デフォルトの名無しさん:2006/06/15(木) 23:10:28
ハードル上げすぎてスルーされちゃったわけですか……
494デフォルトの名無しさん:2006/06/16(金) 04:45:32
>>486
循環を含むようなデータを考えると必要な場合があるということだと思う。
どんなデータかはぱっとは思いつかないけど、Webのリンクを含むようなやつとか、ファイルシステムとか?
495デフォルトの名無しさん:2006/06/16(金) 14:15:43
関数型言語の世界はLispの世界から多くを引き継いでいるけど、
Lispのprint関数はそういうのに対する配慮が厚い。

Common Lispの場合は、
・*print-circle*がnil以外で、再帰のチェックをして、
#n=, #n#を使って、再帰構造を再構築可能な印字表現を出力する。
;;; 確か共有構造再現の処理もやったはず。
・*print-level*, *print-length*で深さ、長さの上限指定

環境のdump/restoreを昔からやっていたからだと思う。
*print-readably*は、read可能な印字表現の強制を行う。

シリアライゼーション考えると、
まともな言語/ライブラリは当然持っていていい機能だと思う。


496デフォルトの名無しさん:2006/06/16(金) 14:17:38
>>495
> ;;; 確か共有構造再現の処理もやったはず。

CLtLには、
;;;
For example, the result of

(let ((x (make-symbol "FOO"))) (list x x))

would be printed as

(#:foo #:foo)

if *print-circle* were nil, but as

(#1=#:foo #1#)

if *print-circle* were not nil.
;;;
な例が。
497デフォルトの名無しさん:2006/06/16(金) 18:47:45
> まともな言語/ライブラリは当然持っていていい機能だと思う。

まともな関数型言語はLispしかないことが証明されたね
498デフォルトの名無しさん:2006/06/16(金) 18:59:55
>>497
Lispもダメだということが証明されたが
499デフォルトの名無しさん:2006/06/16(金) 23:52:51
は?
500デフォルトの名無しさん:2006/06/17(土) 11:52:41
500get ズサーッ

Lispの話書いてごめん。荒れちゃった…
501デフォルトの名無しさん:2006/06/17(土) 18:35:40
Lisp最高!
502デフォルトの名無しさん:2006/06/19(月) 17:21:24
Lip Stick Adventure
503デフォルトの名無しさん:2006/06/24(土) 18:48:48
もっとOcaml盛り上がろうぜ
504デフォルトの名無しさん:2006/06/24(土) 19:05:13
ここの連中は声にする度胸の無いガキでFAだから期待すっだけ無駄だぜ。
毎日毎晩、串挿してシコシコキーボード叩いてろって一蹴しちゃえ。

ちなみに俺と話すならスカイプIDは dj-tama で検索なりしてくれればOK。
どっかで見覚えあるID? 細かい細かい。知ったこっちゃね。
505デフォルトの名無しさん:2006/06/25(日) 01:26:28
>> 503
じゃあ O'Caml、せめて OCaml と書いてくれや。
506デフォルトの名無しさん:2006/06/25(日) 12:09:47
OCamlに足りないものってなんだろうね。
507デフォルトの名無しさん:2006/06/25(日) 14:27:27
ときめき
508デフォルトの名無しさん:2006/06/25(日) 15:35:03
モテ要素?
509デフォルトの名無しさん:2006/06/25(日) 16:04:32
世話焼きの幼馴染
510デフォルトの名無しさん:2006/06/26(月) 01:26:17
角度とか
511デフォルトの名無しさん:2006/06/26(月) 01:57:25
ブラコンで甘ったれの妹
512デフォルトの名無しさん:2006/06/26(月) 21:53:19
やさしく癒してくれる統合開発環境
513デフォルトの名無しさん:2006/06/27(火) 01:48:02
厳しく怒ってくれるコンパイラ兄
514デフォルトの名無しさん:2006/07/04(火) 14:06:38
514
515デフォルトの名無しさん:2006/07/15(土) 17:50:59
wxCaml開発再開してくれないかなぁ。
516デフォルトの名無しさん:2006/07/15(土) 17:56:44
camlってフランス人が開発してるでしょ。
だから閉鎖的なんだよね。
開発が遅れるのも当然。。
517デフォルトの名無しさん:2006/07/17(月) 18:35:26
GCC版のMLコンパイラってありますか?
518デフォルトの名無しさん:2006/07/21(金) 22:15:30
ML使いのサイトいっぱい教えて
519デフォルトの名無しさん:2006/07/22(土) 02:33:52
夏ですなあ
520デフォルトの名無しさん:2006/07/22(土) 11:16:42
MLってなんでオーバーライドできへんの
521デフォルトの名無しさん:2006/07/22(土) 11:37:35
MLにクラスがないから
522デフォルトの名無しさん:2006/07/22(土) 13:42:19
ふーん。クラスにしかオーバーライドって無いんだ
523デフォルトの名無しさん:2006/07/23(日) 15:27:59
夏だな……
524デフォルトの名無しさん:2006/07/23(日) 16:01:21
camlp4 で
try .. with .. finally
って書ける構文拡張ってある?
あるなら自作のじゃなくてそっちを使うんだけど。
525デフォルトの名無しさん:2006/07/23(日) 20:44:27
camlp4のチュートリアルってなんであんなに分かりにくいんだろうね
526デフォルトの名無しさん:2006/07/23(日) 21:38:47
マクロ・プリプロセッサのドキュメントや解説が解りやすかったためしなどない。
527デフォルトの名無しさん:2006/07/23(日) 22:23:00
528デフォルトの名無しさん:2006/07/23(日) 22:43:19
>>524
紹介サンクス。
ただ、それは試したんだけど  try .. finally しか書けなかった。
529デフォルトの名無しさん:2006/08/01(火) 11:08:49
紛らわしすぎ。

MS/IBM/Sunなど10社、ITリソース用モデル化言語「SML」草案を公開
http://www.nikkeibp.co.jp/news/it06q3/509767/
530デフォルトの名無しさん:2006/08/01(火) 13:31:16
>>529
これはひどいな。もうすこし考えて名前付けりゃいーのに。
531デフォルトの名無しさん:2006/08/01(火) 20:07:31
こっちのSMLもあんまり考えてつけたような名前ではないような。。
532デフォルトの名無しさん:2006/08/01(火) 22:54:48
>>530
3 文字の achronym なんて数が限られているから仕方が無いんでない。
個人的には、何年か前までは SML といえば Smalltalk Mailing List だったし。
533デフォルトの名無しさん:2006/08/01(火) 23:40:05
個人的には、何年か前までは SML といえばドリンクのサイズだったし。
個人的には、今 SML といえばエロゲ屋のことだし。

http://www.google.com/search?q=SML
535デフォルトの名無しさん:2006/08/03(木) 21:20:28
>>534
google1位かよ。SEO対策できてるのなw
536デフォルトの名無しさん:2006/08/03(木) 21:55:24
そのエロゲはSMLで作ってるのかな
537デフォルトの名無しさん:2006/08/07(月) 21:27:11
metacaml
538デフォルトの名無しさん:2006/08/09(水) 21:43:02
http://itpro.nikkeibp.co.jp/article/COLUMN/20060808/245371/
こんなの始まった。OCamlメジャー化するといいなあ。
539デフォルトの名無しさん:2006/08/09(水) 22:25:45
smiiさんのブログは結構楽しいけど、今回の記事はなんだか
もやもやした内容だなぁ
540デフォルトの名無しさん:2006/08/10(木) 13:27:06
楽しみですねぇ
541デフォルトの名無しさん:2006/08/10(木) 14:33:32
研究の歴史は長いけど一向に実用化する気配が無い
自動的静的メモリ管理(リージョン推論、コンパイル時GC)の話が読みたいなぁ。
542デフォルトの名無しさん:2006/08/11(金) 00:48:16
>>541
そんなもんあるのか。知らんかったお。

Implementation of the call-by-value lambda-calculus using a stack of regions
A theory of stack allocation in polymorphically typed languages

こーゆーやつ?

543デフォルトの名無しさん:2006/08/12(土) 06:54:37
今、日本の大学でML系言語教えてるのは東大ぐらい?
東大はSML?OCaml?
544デフォルトの名無しさん:2006/08/12(土) 10:45:00
>>543
俺は東工大だが、コンパイラの授業でやるよ。
545デフォルトの名無しさん:2006/08/12(土) 12:04:33
OCamlもhaskelも日本語(というか多国語)扱えないからいまいち遊びと実験の域から先に進めないのはなんとかならんのだろうか。

一文字を一文字として扱える用になれば実用ユーティリティにも使うんだけどなぁ。 (ショボーンAA略)
546デフォルトの名無しさん:2006/08/12(土) 15:44:10
>> 545
是非自分で書いてください。
547デフォルトの名無しさん:2006/08/12(土) 16:16:09
>>541
リージョン推論とか詳しくないから聞きたいんだけど、
実用的に使うにあたって何か技術的な困難があったりするの?
それとも、単にあまり知られていないだけ?
548デフォルトの名無しさん:2006/08/12(土) 19:20:39
stringとcharがあってもstringがcharのリストなり配列に還元されない
っていうのはいったいどういうつもりでそうなってるのかな。
549デフォルトの名無しさん:2006/08/12(土) 23:56:11
>>543
東北大だけど、プログラミング演習Bでやった。というか今レポートやってる。
講義の半分はJavaだから、MLは90分*5週だけど。

この科目は今年かららしい。
550デフォルトの名無しさん:2006/08/13(日) 08:16:54
>545
Camomile は?
551デフォルトの名無しさん:2006/08/13(日) 23:23:00
>>549
東北大は住井先生が教えておられるんだっけ?
結局、教える人がいるかいないかで、授業で採用されるかどうかが決まるわけか。
東工大はどなたが教えてるのかな?
552デフォルトの名無しさん:2006/08/13(日) 23:40:18
東工大は、情報科学科の方かな?
情報工学科でやってた憶えはないけど。
553デフォルトの名無しさん:2006/08/14(月) 11:44:56
東大は理学部の情報科学科でOCamlを教えてるな
工学部のどっかではHaskellをやってたような気がするが詳しく知らない
554デフォルトの名無しさん:2006/08/14(月) 15:51:13
>>547
動的型や副作用が入ってくると、いきなり解析が難しくなるんですよ。
Cでキャストやポインタ演算を使うと、究極的にはメモリ空間のどこでも
指すことができるわけだし。
それに、手動管理(malloc/free)との混在も話がややこしくなる。
逆に言えば、C以外の、メモリアクセス手段が制限されている言語であれば、
うまく使うことによってGCの仕事を減らすことができる。
Java SE 6 に導入される予定の「エスケープ解析」(関数スコープの外に
出て行かないと解析できたオブジェクトはヒープではなくスタックに置く)は
リージョン推論の亜種だと思う。
555デフォルトの名無しさん:2006/08/14(月) 18:46:28
str2list, list2str みたいな関数って標準ライブラリにないの?
556デフォルトの名無しさん:2006/08/14(月) 18:52:56
SMLだとexplode/implodeっていうのがあるけどそれかな。
OCamlの標準ライブラリにexplode/implodeがないのはかなり疑問。
557デフォルトの名無しさん:2006/08/14(月) 19:07:28
>556
thx. つか早っ。
やはり OCaml にはないのか…。OCaml では文字列のまま処理するのが
一般的なのかな。どうも手続き型っぽい処理になって気持ち悪いんだけど。
558デフォルトの名無しさん:2006/08/17(木) 11:36:03
つ extlib

変に char list <=> string 変換をバリバリされて遅いプログラムを
書かれる位なら、標準ライブラリからは外す、というデザインだと思われる

名前は判らなくても型は判る関数を探すには、標準ライブラリの .mli を
grep するか ocamlbrowser を使って探すとよい。まあ、この場合ないわけだけど
559796:2006/08/23(水) 22:48:29
>485
そのfibは構造を共有していないので O(2^n)になってるよ!
let fib =
ってすると怒られるから、OCamlではそういう再帰構造は書けないのかな
560デフォルトの名無しさん:2006/08/25(金) 18:35:21
>>559
なるほどね
どうりでメモリを食いまくるわけだ
構造の共有か……
うーむ
561560:2006/08/26(土) 01:24:03
>>559
let rec fib () =
 0 +: 1 +: (let fb = fib () in zip_with ( + ) fb (tl fb))
というように変更したら、遅延評価のキャッシュが効いて、速く計算できるようになったよ。
再帰的なデータという意味合いからは外れるけど、確定した値は再計算しないということでは
同じことになっていると思う。
562デフォルトの名無しさん:2006/08/26(土) 02:22:26
いや、まあそうすれば早くなるんだけど、それでも、
N > 2の時は、N番めの値を求めるには新しい fib () の N - 1番目まで
計算しているから計算量は大体ΣNくらいある。
これはO(n^2)だから、
Haskellで同じように書いた場合はO(n)よりも効率がわるい。

で、OCamlでは
let rec a = a + 1
とか書けないから、OCamlではこの形ではO(n)にできないんじゃね?っていうはなし。

とういわけで、頭のいい人再帰的な定義かつO(n)のfibを書いてくれ!




563デフォルトの名無しさん:2006/08/26(土) 02:36:41
正:Haskellで同じように書いたO(n)よりも効率がわるい。
文がおかしくなってた。
564デフォルトの名無しさん:2006/08/26(土) 04:35:20
>560は馬鹿と認定されますたwwww
565560:2006/08/26(土) 15:52:02
>>562
詳しい仕組みとかは全然分からないんだけど、
let rec fib = lazy(
 (num_of_string "0") +: (num_of_string "1") +:
  zip_with ( +/ ) (Lazy.force fib) (tl (Lazy.force fib)))

let _ =
 print_endline (string_of_num (LazyList.nth (Lazy.force fib) 1000))
というように「lazy()」で括ってみて、-rectypesオプションでビルドしたら、なんかうまくいった。
多倍長整数を使って1000番目を計算しても、Haskellと遜色ない速度で答えが出る。
566562:2006/08/26(土) 16:19:26
ほんとだ!サンクス!
567デフォルトの名無しさん:2006/08/27(日) 10:51:26
なんか各ブログのLL Ringのレポートを読むとOCamlは馬らしい。ラクダではなかったのか。
568soutaro:2006/08/27(日) 16:32:24
ラクダです。
ラクダマスクのつもりだったのですが、工作精度の悪さが災いして、
馬にしか見えなかったみたい。反省。
569デフォルトの名無しさん:2006/08/27(日) 23:13:43
やっぱりそうなんだ。じゃあ来年はコブ付きで・・・
570デフォルトの名無しさん:2006/08/30(水) 06:02:37
筑波でOCamlやってます。ガリグさんって人が来てます。
集中講義で2単位くれるっていうから取ってみたけどついていけませんorz
571デフォルトの名無しさん:2006/08/30(水) 15:16:36
OCaml で文字列処理するの C 並に面倒くせぇ…。
572デフォルトの名無しさん:2006/08/30(水) 18:06:23
けっきょく効率的に書こうとすると命令的になるしな。
573デフォルトの名無しさん:2006/08/30(水) 21:24:35
>>570
講義資料見たけど、確かにあれを2日間で初心者がやるのはちょっときついかも
574デフォルトの名無しさん:2006/08/30(水) 21:25:43
最初はそう思ったけど最近は「効率的に書こうとするときの素直な手段」が
提供されているというのはいいことだと思えてきた。
575デフォルトの名無しさん:2006/08/30(水) 21:54:38
「プログラミング言語の進化の歴史は、文字列を簡単かつ効率的に扱えるようにするための試行錯誤の歴史である」

どこで聞いた台詞であったか。
576デフォルトの名無しさん:2006/08/30(水) 22:01:55
どこ?
577デフォルトの名無しさん:2006/08/30(水) 22:17:14
惹玖がんばってね。
578デフォルトの名無しさん:2006/09/04(月) 09:29:09
知り合いの方に

「ocamlcでなくocamloptで使える,dlopenのような動的リンク機構がないか」

と尋ねられたのだけど,私には分かりませんでした.
どなたかご存知の方いらっしゃいません?
自作ソフトにいわゆる「プラグイン」の仕組みを盛り込みたいらすぃ
579デフォルトの名無しさん:2006/09/04(月) 22:23:05
友達から聞いたんだけど〜(ry
な話はたいてい実は本人の話な件について
580デフォルトの名無しさん:2006/09/04(月) 22:31:51
>>579
大変申し訳ない。

578じゃないけどな〜
581デフォルトの名無しさん:2006/09/04(月) 22:35:08
プラグインは何言語で書きたいのさ。
582デフォルトの名無しさん:2006/09/05(火) 00:49:09
>>578

ttp://caml.inria.fr/pub/ml-archives/caml-list/2005/12/c583b03155e82f2d0f4e7ab031542f17.en.html

でどうかな?ちょっとぐぐったら出てきたんだけど。

いったんCでwrapすれば、OCamlのコードを共有ライブラリにできるけど、
それをOCamlから直接使えるようにサポートする気はない

とXavierが去年の12月に言ってる。
583デフォルトの名無しさん:2006/09/06(水) 08:59:00
578 の知合いが
する気はない=する気のある人募集
と読みかえる漢であることを望む
584デフォルトの名無しさん:2006/09/06(水) 09:01:34
>>583
漢と書いて「おとこ」と読ませたいらしいが、この文字が人に当たるときに
「卑劣漢」「詐欺漢」といったネガティブな熟語ばかりが想起されていやだ
585デフォルトの名無しさん:2006/09/06(水) 09:49:02
漢はおとこだよ。人に当たるって何?
熱血漢って10回言ってみ。詐欺漢て何?初めて聞いた。
586デフォルトの名無しさん:2006/09/06(水) 13:29:45
>>585
もっともポピュラーな例「痴漢」
587デフォルトの名無しさん:2006/09/06(水) 13:32:17
無頼漢ってのもあるな
>>585
子供じゃしらんかもしれん、最近は言わないからね。
588デフォルトの名無しさん:2006/09/06(水) 13:36:18
>>587
30歳でも子供でしょうか?
589デフォルトの名無しさん:2006/09/06(水) 14:55:04
>>588
おっさんキター

まじめな話プログラミング言語より日本語の書物を読んで語彙力つけるべきじゃないかと思います。
590デフォルトの名無しさん:2006/09/06(水) 15:01:01
>>589
語彙力って何ですか?

その時々の流行の言葉を覚えればいいのでしょうか。
591デフォルトの名無しさん:2006/09/06(水) 19:05:36
レスって何ですか?
592デフォルトの名無しさん:2006/09/06(水) 20:57:46
↓何事も無かったかのように ML の話が始まります
593デフォルトの名無しさん:2006/09/06(水) 23:17:48
SML
Sadistic Mika Land
594578:2006/09/07(木) 02:59:20
>>582
> いったんCでwrapすれば、OCamlのコードを共有ライブラリにできるけど、
> それをOCamlから直接使えるようにサポートする気はない
> とXavierが去年の12月に言ってる。

ふむ,なるほど.本人の言葉ですか...
やっぱりnative codeにしてしまうと型が分からなくなってしまうので,それを嫌っているんでしょうね.

なんかTyped Assembly Languageを使ってnative codeを安全に動的ロードしよう... という研究があるけど,
http://citeseer.csail.mit.edu/471673.html
まだ先は長そうだ.
595デフォルトの名無しさん:2006/09/13(水) 21:55:17
ITProの連載2回目だけど、もうちょっとこうOCaml sugeeee!!って感じの煽りがほしいです。
596デフォルトの名無しさん:2006/09/15(金) 07:42:12
本人のはてな日記に書くがよろし
レスきっと付くよ
597デフォルトの名無しさん:2006/09/18(月) 03:35:11
OCamlsugeeeeと思うコードを紹介せよ。
いまいち思いつかんな・・・
598デフォルトの名無しさん:2006/09/18(月) 04:26:59
新鮮でインパクトのある例がまだあるかなぁ。
素人に直観的にアピールできる関数型言語のsugeeところは
スクリプト言語たちにあらかたパクられちまったし。
599デフォルトの名無しさん:2006/09/18(月) 14:24:50
では、スクリプト言語ではとうてい達成できないであろう
「速さ」をアピールしてはどうか
600デフォルトの名無しさん:2006/09/18(月) 14:29:52
>>599
それはね、単にコンパイラの作者が優秀なだけ。。
別にOCamlだから実現できたという訳ではない。
601デフォルトの名無しさん:2006/09/18(月) 16:55:32
URL失ってしまったがSMLでコンパイラ構築する手順みたいの書いていたサイトがあって
結構感動した覚えがある。
602デフォルトの名無しさん:2006/09/18(月) 22:36:43
言語の個性とかは置いといて、他のスクリプト言語と違って
native コンパイルができるというのは利点ではないの?
603デフォルトの名無しさん:2006/09/18(月) 23:33:50
OCamlは実装がsugeeということか。
604デフォルトの名無しさん:2006/09/19(火) 01:43:26
言語研究者の視点に立つと >>600 見たいな考えになるんだろうな
実用主義者にとってはツールの性質が使用する動機になる
605デフォルトの名無しさん:2006/09/19(火) 06:30:26
そういえば俺が使い始めた動機のひとつはネイティブコンパイルできることだった。
でもHaskellもコンパイルするとバイナリできるよね?
よくしらないんだけどあれはocamlrunみたいなものに依存してるのかな
606デフォルトの名無しさん:2006/09/19(火) 14:05:22
GHCだと、HaskellのコードをCのコードにしてから機械語にしてるんじゃなかったっけな。
607デフォルトの名無しさん:2006/09/19(火) 19:58:20
そしてlibgmp.soとかに依存するぜ
608デフォルトの名無しさん:2006/09/19(火) 20:19:57
caml は自力でやってるんですか?
609デフォルトの名無しさん:2006/09/19(火) 23:23:45
ocamloptの場合はそうでしょ。
610デフォルトの名無しさん:2006/09/19(火) 23:55:57
>>606
中間コード→最適化→中間コード→最適化→機械語
611デフォルトの名無しさん:2006/09/19(火) 23:56:25
実装が速いというのもこの言語仕様あってのことだよね。
rubyとかセマンティクス上どうしても効率の良い実装は作りづらい。
612デフォルトの名無しさん:2006/09/20(水) 00:02:03
OCamlって実行時に使う型情報ってどのくらい残ってるんですか?
613デフォルトの名無しさん:2006/09/20(水) 12:15:16
>>601
SMLでコンパイラ書いてみせるのは割とpopular
614デフォルトの名無しさん:2006/09/20(水) 14:35:48
つーかそれぐらいしかやる子とないよね
615デフォルトの名無しさん:2006/09/20(水) 14:50:38
>>613
論文なら結構あるのしってるけど日本語のサイトで自分の論文の種書いたのあんまり見かけないorz
616デフォルトの名無しさん:2006/09/20(水) 18:27:16
MLコンパイラdがMLコンパイラd'より優れていることを d ≦ d' と書く。
このとき、MLコンパイラの集合( D, ≦ )は、Edinburgh LCF MLを最小元とする完備半順序集合である。
D上の研究 f:D→D は、MLコンパイラdを使用してMLコンパイラd'を作成する。
このとき、d ≦ f(d) でなければならない。
d = f(d) である不動点dが得られたとき、かつそのときに限り、MLの研究は終了する。
617デフォルトの名無しさん:2006/09/20(水) 19:00:17
>>616
不等号が逆?
それともMLコンパイラを改悪することを研究と呼ぶのか。
618デフォルトの名無しさん:2006/09/20(水) 19:39:11
>>617
創始者を超えることは出来ません。だから最小元なのです。
619デフォルトの名無しさん:2006/09/20(水) 19:55:12
つまり自分自身のソースコードしかコンパイルできないMLコンパイラを書けばいいわけだ。
俺にもできそうな気がしてきた。
620デフォルトの名無しさん:2006/09/20(水) 23:56:34
ml → javascript な言語拡張ってないかな
にしても CDuce はとっつきにくいよね
621デフォルトの名無しさん:2006/09/21(木) 21:13:04
日本語OCaml本がついに複数出るらしいけど日本にそんなに書き手がいたんだ。
622デフォルトの名無しさん:2006/09/21(木) 21:29:46
>>621
キャッチコピーはこうだ。

「素人が素人に送るOCaml本の決定版!」
623デフォルトの名無しさん:2006/09/21(木) 21:41:11
"Practical OCaml"は読んだ?
624デフォルトの名無しさん:2006/09/21(木) 22:37:36
"Prizmatical OCaml"は読んだ?
625デフォルトの名無しさん:2006/09/21(木) 23:12:06
お兄ちゃん……おはよう。型環境、できています
626デフォルトの名無しさん:2006/09/21(木) 23:57:34
明示的に型を書くというのは、保守的なために敗北したかのような、
苦い後悔が残るものだ…。
627デフォルトの名無しさん:2006/09/22(金) 00:20:02
そして他人のコードを読む時に、その後悔は埋め合わされる。
628デフォルトの名無しさん:2006/09/22(金) 12:09:26
>>625
英語で書くとマッチョダンディな世界に見えて鬱だぞ(w
629デフォルトの名無しさん:2006/09/22(金) 12:30:28
Ocamlで書かれたsugeeeソフトウェアをアピールすればOcaml sugeeeと思ってもらえるかもしれないね。
MTASCとかC--とかNekoVMとか。
630デフォルトの名無しさん:2006/09/22(金) 14:53:19
MTASCはともかく他2つはどうだろう……。

Unison があまりにも知られていないのはちょと悲しい
631デフォルトの名無しさん:2006/09/22(金) 16:11:49
MATSCはすごよね
632デフォルトの名無しさん:2006/09/22(金) 20:25:26
凄いのにつづりを覚えてもらえない件について
633デフォルトの名無しさん:2006/09/22(金) 20:27:37
もういい加減頭文字略語にはうんざりしてんだ。
634デフォルトの名無しさん:2006/09/22(金) 20:28:35
なんて読んだらいいのか解らないような略語つくんなぼけって言いたいね。
635デフォルトの名無しさん:2006/09/22(金) 20:55:58
まるで前民主党党首のようですねぇ。

636デフォルトの名無しさん:2006/09/28(木) 00:33:33
【社会】ICFPの国際プログラミング・コンテストで日本のチーム「kuma-」が2位に
http://news19.2ch.net/test/read.cgi/newsplus/1159369025/

>プログラミング言語としてはRuby,C,C++,D,Java,Perlを使用した。

アレ??
637デフォルトの名無しさん:2006/09/30(土) 16:08:10
出題者側がちょっと本気を出すと、関数型言語では歯が立たないという現実
どんな問題でも対応しようと思えばできる手続き型言語はすばらしい
638デフォルトの名無しさん:2006/10/04(水) 22:22:28
OCamlって何て読むの? おかむる?
639デフォルトの名無しさん:2006/10/04(水) 22:31:48
640デフォルトの名無しさん:2006/10/14(土) 16:26:28
日本語本まだかな〜。
641デフォルトの名無しさん:2006/10/14(土) 16:32:54
日本語本って、どこから出るの?
誰が書いてるの?
642デフォルトの名無しさん:2006/10/15(日) 04:19:37
日本語本には是非
ユニオン型とかを詳しく書いてほしいね
643デフォルトの名無しさん:2006/10/15(日) 17:04:40
日本語での入門なら、京大の五十嵐先生の講義用テキストがいいよ。
644デフォルトの名無しさん:2006/10/15(日) 18:01:27
惜しいなぁ・・
俺の先生が書いたテキストを公開してくれればなぁ・・・細かいところまで解説してくれていて良いテキストなのに・
受講生のみなんだよね・・
645デフォルトの名無しさん:2006/10/15(日) 20:36:38
どこの大学です?
先生の名前臥せなくてもいいのでは?
646デフォルトの名無しさん:2006/10/15(日) 21:03:41
UPUP!
647デフォルトの名無しさん:2006/10/15(日) 21:57:51
DOWN DOWN!
648デフォルトの名無しさん:2006/10/15(日) 22:05:23
>>645
晒したりとかしたらダメなんだよ。
本にする予定みたい。
649デフォルトの名無しさん:2006/10/15(日) 22:08:34
本にする予定って知っているのに何故「公開してくれればなぁ」と残念がるのか
650デフォルトの名無しさん:2006/10/15(日) 22:19:15
                  r=ニ二.._;:::::::::::::::::.:... ̄`:i 冫          `` - 、
        クスクス♪      \    /::::::::::::::::::::::::::::::.:..∨              ヽ  \
          r‐ ,           i\ /::::/.::::::::::;:::::::/|::::::://  /  / .   , /    「 ̄ フ
          /:: /          |:::::|:::::,'.::::/:: //:::イ |:::::|{ | | / //!{ }1イ / .  | },. イ
         /:/           .|:::::|i::::i::::::|: //::〃! |::j'1ハi. |仁i/i从/大iト、} / ハ /
.      /:/       _      |:::::|i:::|::::N/厶イ/ノ j/廾}::ト〈.|_j{   r=ミV' / /, }/  OCamlよろしく〜〜
     /:/         {:.ヽ.    j ┴く::::l:i《bし{   }5T}: | |   ,.   }しリ゚ / /,/
.    /: /          \.ヽ/      Yi:ト  ̄   ,. ¨`ハハ ト、 ー-   ,/ / /艸     ___
   /::/            /       |ヽi:ト、 t ァ ノi/  ヽ. ヽ- < /ノ イ/ .|      {  |
.  /::/               /     ヽ     |:: ゝ//T ´            ___\// ji\   |  |
.. /::/         , ィ {.     |    |::{く / i  i:|:. i.   i     |. \〉. /リ.  i.  |  |
  |:::|     ,.   ´  | \ __ |    |:.ヽ:\ !| |:| | i. |. ! , |__,.イ// ノ  |.  |  |
  |:::|     /      ! .  ,:r'' ̄|    |::::::i:::::} |i弋ナ|ヽl从‐|i-j/  }イ jハ{.    /   |  |
  ヽ:.ヽ._,.イ         \`r'   |    |从jハノハkげi`  'iげ}j/  || /   /   .|  |
    ヽ/ {            \     |    | | | |iゝ ̄  ,   ̄ /'/ j.||./    /     丿 ,ノ
.    /  \        /  ̄ ̄「|    | V! |! ト、  r┐  /'/ /ハ,ハ|   /   / /
   |      ` ー―一ァヘ       l |     {.   Vi'ア / ̄〉,ハ'´j/j/リ ノ/    ∧  / /
http://caml.inria.fr/
651デフォルトの名無しさん:2006/10/15(日) 22:36:29
誰?
652デフォルトの名無しさん:2006/10/16(月) 20:58:17
このスレでよくあらわれるOcamlハカー(学生さん?)が書いたほうが
良い本が出来そうな気がするけどな
653デフォルトの名無しさん:2006/10/16(月) 21:49:22
>>652
それって俺のこと?
だったら俺の先生の方が上だよ
654デフォルトの名無しさん:2006/10/18(水) 15:37:51
理屈うんぬんすっとばして使うだけの本だったら学生が書いたほうが良さそう
655デフォルトの名無しさん:2006/10/18(水) 16:34:00
偉〜い先生って、一般的・抽象的に書くのが好きだからどうしても具体性に欠けるんだよねぇ。
一般的に書くのがかっこいいと思ってやがるの。
自分の文書が使い捨てにされるのが我慢ならないんだね。
マジできもいし。
656デフォルトの名無しさん:2006/10/18(水) 21:07:22
http://www.smlnj.org/
sml/njのサイトが繋がらない。
index以外は404だし…
クラックされたのだろうか
657デフォルトの名無しさん:2006/10/18(水) 21:25:58
ocamlnet2 って互換性とかどう?equeue とか色々一緒にまとめちゃったんでしょ?
以前のバージョンで書いたソースの手直しとか発生する?
658デフォルトの名無しさん:2006/10/20(金) 00:12:31
>>655
しかも洋書のパクリみたいな内容
659デフォルトの名無しさん:2006/10/20(金) 04:10:06
ML系の言語で整数が機械語の一ビットを使ってるって言うのがいまいちわからない
いちいちくわしくおしえてくれ
660デフォルトの名無しさん:2006/10/20(金) 07:49:56
レジスタに収まるサイズのデータ(整数)とそうでないデータ(メモリブロックへのポインタとして表現されるその他の大きいデータ)を、そのレジスタに収まるサイズ分だけ見て判別できるようにするために1ビットつかって印をつけているということだと思う。
そのビットが0だったらそのまま整数とみなして、そうでなかったらポインタとみなす、みたいな。
661デフォルトの名無しさん:2006/10/20(金) 09:18:05
単にGC用のビットじゃネーノ

型検査は静的に終わってるんだから動的型情報を持っておく意味ないし
662デフォルトの名無しさん:2006/10/20(金) 09:20:56
強い型のMLでそれが必要なのか? っていう疑問だと思うけど。
663デフォルトの名無しさん:2006/10/20(金) 13:11:36
多相関数に対して整数用とポインタ用2つのコード生成すんのマンドクセ、ってこと。
2つ作るだけならいいんだけど、引数の数が増えると指数関数的に増大する。
664デフォルトの名無しさん:2006/10/20(金) 13:15:34
GCでポインタ辿るときにポインタか整数か見るため?
665デフォルトの名無しさん:2006/10/20(金) 22:59:15
SML#ではちゃんと32ビットあるらしいけどそこんとこどうやってるんですか。
666デフォルトの名無しさん:2006/10/20(金) 23:58:50
>>663 なんで整数用とポインタ用2つのコードを生成するひつようがあるの?

667デフォルトの名無しさん:2006/10/21(土) 00:46:51
MLに限定した話じゃないよな
静的型付き言語をGC付きで実装するときには避けて通れない点だ
データが整数かポインタかどうやって判定する?

α.データだけを見て判定する
たとえば有効なアドレスの可能性があるならポインタと判定し
その可能性がゼロのときに限って整数とみる
ゴミを除ききれないのが欠点だ

β.実行時にも型情報をもたせてGC時にそれを見て判定する

β.1.データに型情報を埋め込む
32bitワードを31bit整数と1bit型情報で分けるのがこの方法
データの数に比例して型情報の合計サイズも増えてしまうのが欠点だな

β.2.型情報をデータと別の領域に持つ
データの数が増えても型情報のサイズは一定
しかし多相型を扱えない. データの型が実行時にならないと
決まらないから型情報をコンパイル時につくれないから.

例えばSun Javaの実装は別領域に配置した型情報への
ポインタをオブジェクトに持たせているからβ.1.とβ.2.
の折衷だな
MLのデータ構造に比べたらJavaのオブジェクトはそれほど頻繁
に生成されるものではないからポインタを持たせるコスト
もacceptableだと判断したんだな
MLの場合膨大な数のデータが生成と消滅を繰り返すから
ワードサイズのポインタを持たせるのは到底受け入れられ
ない. bitだけ持たせることにしたんだな. それしかいらないし.
Javaの場合, 整数かポインタかだけじゃなくてクラスやインタフェイス
の継承関係も実行時に必要だから1bitじゃ足りない
668デフォルトの名無しさん:2006/10/21(土) 01:17:35
>>667
多相型の関数は必要なだけ作れば?
どういう型のラインナップが必要かは実行しなくてもわかるんだから。
669デフォルトの名無しさん:2006/10/21(土) 09:54:07
データを生成する関数が多相型であろうとなかろうと
GCつけるならデータの型を実行時に判定しなくちゃならない。
多相型のない言語でもGCを付けるならこの問題は同じ。
多相型があると解法が限定されてしまうが。
670デフォルトの名無しさん:2006/10/21(土) 12:41:47
>>669
> GCつけるならデータの型を実行時に判定しなくちゃならない
自体は真だけど、それはタグビットを値に持たせることが必須となることの
十分条件ではないね。
671デフォルトの名無しさん:2006/10/21(土) 14:41:48
タグビット以外だと BIBOP が有名だね。
使えるメモリ量が増えたから BIBOP 使えねという話を読んだ事があるけど、
領域毎に格納するオブジェクトを決めておく方式は良いアイデアだと思う。
672デフォルトの名無しさん:2006/10/24(火) 10:04:09
C とかで

(a==b)? a : 0

とか書くじゃないですか
こういうのってOcaml にもありますか
毎度 if then else 書くのが疲れるので・・・
673デフォルトの名無しさん:2006/10/24(火) 10:43:36
ない
やりたきゃ camlp4 使え
674デフォルトの名無しさん:2006/10/24(火) 22:01:37
はい。

# 1=2 && true || false;;
- : bool = false
# 1=1 && true || false;;
- : bool = true

3項演算子のない言語では割と一般的な慣用句だよん。
なんでもcamlp4使おうとするのは逆に頭固いと思う。
675デフォルトの名無しさん:2006/10/24(火) 22:04:56
あ、まって。ごめん。
676デフォルトの名無しさん:2006/10/25(水) 00:27:25
boolだけにしかつかえなーい
677デフォルトの名無しさん:2006/10/25(水) 03:18:12
いつからBASICスレになったのかと思ったw
678デフォルトの名無しさん:2006/10/26(木) 21:49:57
http://www.pllab.riec.tohoku.ac.jp/slides/jssstTaikai2006sli.pdf
これおもしろいですね。誤字が多いけど。
679デフォルトの名無しさん:2006/10/26(木) 22:46:16
SML# に期待
680デフォルトの名無しさん:2006/10/26(木) 22:52:54
SML!
SML?
681デフォルトの名無しさん:2006/10/26(木) 23:10:47
SML# >>>> ruby
682デフォルトの名無しさん:2006/10/26(木) 23:19:51
SML# >>>> D
683デフォルトの名無しさん:2006/10/26(木) 23:37:03
Dは流行らないと思った。
684デフォルトの名無しさん:2006/10/27(金) 02:50:27
俺は(以前から) G'Caml に超期待。
685デフォルトの名無しさん:2006/10/28(土) 00:33:44
SML# と G'Caml の良いとこ取りをできないかな?
686デフォルトの名無しさん:2006/10/28(土) 04:43:16
SML# >>>> Ocaml
687デフォルトの名無しさん:2006/10/28(土) 05:01:29
SML# >>>> lisp
688デフォルトの名無しさん:2006/10/28(土) 10:38:43
GcamlとOcamlっていうのどこがどうちがうの?
689デフォルトの名無しさん:2006/10/28(土) 13:50:14
ocamlの和書ってどうなったのさ。
690デフォルトの名無しさん:2006/10/28(土) 17:43:02
ワショーイ!!
691デフォルトの名無しさん:2006/10/29(日) 23:42:00
ocamlでリストを受け取りその要素のべき集合を吐き出せって言う課題でたのですが
↓がその答えなんですが、こんな答えパッと出るものなのですか?
何かアルゴリズムの定石みたいのがあるのですか?それともおれが馬鹿なだけ?
一応書けたけのだけれどおれのは物凄い計算量。
初めて勉学で壁にぶちあたってます。。。

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;;
692デフォルトの名無しさん:2006/10/30(月) 03:34:07
ocamlどうこうより再帰的な考え方の問題。慣れればどうってことないよ。
逆に言えば慣れることが大事。
693デフォルトの名無しさん:2006/10/30(月) 04:22:21
691です
>>692
なるほど。大1でプログラミング能力はJavaをちょっと齧った程度です。
Javaのソートなどは見ていてなるほどなぁ、と思ったのですがOcamlの
それを見て、どこからこんなの思いつくんだ!?って思ってしまいました。
やっぱ慣れなんですかね?
とっつきは記述の仕方など数学に似ている部分があったのでocamlのほうがスラスラ
いったのですが…
694デフォルトの名無しさん:2006/11/06(月) 00:14:35
定理証明を利用したオブジェクト指向解析とかそのへんって
今どれくらいまで進歩したの?
695デフォルトの名無しさん:2006/11/06(月) 01:58:25
いま、関数型言語の間では、関数型言語独自のデザインパターン(らしきもの)というのが研究されているよね。
オブジェクト指向離れが進んできてる気がする。
696デフォルトの名無しさん:2006/11/06(月) 03:26:33
例えばどんなパターンがあるの?
697デフォルトの名無しさん:2006/11/06(月) 03:28:26
SYBとかかな。
698デフォルトの名無しさん:2006/11/07(火) 00:41:08
SYBなんかすげーおもしろそうだけど
論文が2005年の数本と6年の1本ぐらいしかないんだけど
どっから勉強すればいいの?今さXPATHとかああゆうちょっと
普通の言語だと処理しにくい構造のやつSYBだと処理しやすい
みたいだから勉強したいのおしえてちょ
699デフォルトの名無しさん:2006/11/12(日) 06:03:46
scrap your boilerplate?
何これ?
700デフォルトの名無しさん:2006/11/13(月) 01:40:23
scrap your boilerplate ってデザインパターンだったのか
701デフォルトの名無しさん:2006/11/13(月) 01:55:48
全然洗練されてないけどね。論文もへたくそだし。
702デフォルトの名無しさん:2006/12/03(日) 02:09:30
row polymorphism と structual subtyping って、型論理の中身など
知ったこっちゃない俺にとっては同じ抽象化に見えるんだが、どうよ?
<m:int;ρ> だろうが <m:int> <: <m:int;m':string> だろうが、
<m:int>は共通部分ですよって事しか言ってないじゃん。
どっちかに統一できんのか?
703デフォルトの名無しさん:2006/12/03(日) 05:18:48
100年後に再び生まれてくれば統一されているかもよ。
704デフォルトの名無しさん:2006/12/05(火) 22:14:53
そのころにはSMLとOcamlも統一されてUnified MLになってるだろうね
705デフォルトの名無しさん:2006/12/07(木) 08:46:13
VCやgdbみたいな(できればGUIの)デバッガはないの?
コードは書きやすいけど、デバッグがめんどくさい。
706デフォルトの名無しさん:2006/12/07(木) 11:36:00
100年後にはMLなんて忘れ去られてますよ
707デフォルトの名無しさん:2006/12/07(木) 20:53:40
もうちっとだけ続くぞい
708デフォルトの名無しさん:2006/12/07(木) 21:29:58
>>705
ocamldebugというのがありますよ。
709デフォルトの名無しさん:2006/12/07(木) 21:34:16
ヤダヤダ、そんなコマンドラインツールヤダ AA略
ウォッチウインドウとかクリックでブレークポイント設定とかしたいの
710デフォルトの名無しさん:2006/12/07(木) 23:37:23
そんな君にF#。
ただしVS2005Proが必要。
711デフォルトの名無しさん:2006/12/08(金) 21:12:34
Expでダメなのは知ってたけどStdじゃだめなの?(´・ω・`)
712デフォルトの名無しさん:2006/12/09(土) 22:46:45
ocaml でリストを一様にシャッフルする関数を書きたいんですが,

shuffle_list l = (* 'a list -> 'a list *)
let rec shuffle_list' t =
let insert a l n =
let rec insert' a l n t = match l, n with
_, 0 | [], _ -> List.rev_append t (a::l)
| x::xs, n -> insert' a xs (n-1) (x::t)
in insert' a l n []
in function
[] -> t
| x::xs ->
let n = Random.int ((List.length t) + 1)
in shuffle_list' (insert x t n) xs
in shuffle_list' [] l

これでは効率が悪いような気がします.
他に何かいい書き方があるでしょうか?
713デフォルトの名無しさん:2006/12/10(日) 00:49:22
こんなのどうだろう。O(n log n)。

let random_split (l, len) =
  let final_xlen = len / 2 in
  let rec loop source slen x xlen y ylen = match source with
      [] -> ((x, xlen), (y, ylen))
    | (s::ss) ->
        if Random.int slen < final_xlen - xlen
          then loop ss (slen-1) (s::x) (xlen+1) y ylen
          else loop ss (slen-1) x xlen (s::y) (ylen+1)
  in loop l len [] 0 [] 0;;

let shuffle_list l =
  let rec shuffle_list' (l, len) = match l with
      [] -> []
    | [x] -> [x]
    | xs ->
        let (a, b) = random_split (l, len)
        in List.rev_append (shuffle_list' a) (shuffle_list' b)
  in shuffle_list' (l, List.length l);;
714712:2006/12/10(日) 01:50:46
>>713
なるほどこれだと速いですね.ありがとうございます.
この場合はシャッフルが一様である保証ができるでしょうか?
というのは,リストのどの要素も等確率にリストのある位置に
くるという意味ですが.
715デフォルトの名無しさん:2006/12/10(日) 10:13:10
>>713 さんとは別人ですが一様性は成立する気がしますね.

loop の処理は source から final_xlen 個の要素を無作為に選択する処理に他ならないので,

>let (a, b) = random_split (l, len)
で l の各要素が a に入るか b に入るかが等確率であると言えるように見えます.
716デフォルトの名無しさん:2006/12/10(日) 10:16:46
細かいですが,len が奇数の場合には当然等確率にならないので,
厳密には,確率 len / 2 で a に入り,確率 1 - len / 2 で b に入る,
でした.
717712:2006/12/11(月) 01:25:07
>>715,716
ご指摘ありがとうございます.
確かにそう考えるとほぼ一様っぽいですね.
面倒なので証明を考えてみていないのですが十分使えるのでOKです.
改めて 713 さんありがとうございました.
718デフォルトの名無しさん:2006/12/11(月) 02:06:29
肝はn個からk個を選ぶアルゴリズム:
n個から適当な一個に注目し、(k/n)の確率でこれを選ぶ。
さらに残りの(n-1)個から同じアルゴリズムで足りない分を選ぶ。
で、これを使ったとき、考えられるnCk通りが全て等確率で現れることを示せば良い。

nに関する帰納法で示す。n=0のときは自明。
注目された一個が選ばれたとき(確率k/n)、帰納法の仮定から、残りについて(n-1)C(k-1)通りが等確率で現れる。
よって特定の選びかたが現れる確率は、
k/n * (1/(n-1)C(k-1)) = k!(n-k)!/n!
選ばれなかったとき、同様に、
(n-k)/n * (1/(n-1)Ck) = k!(n-k)!/n!
であり等しい。結局全ての選びかたが等確率で現れることがいえた。
719デフォルトの名無しさん:2006/12/11(月) 12:19:27
713のアルゴリズムは面白いね。
実際には、配列に変換してから、ランダムシャッフルするのが
一番楽だと思うけど。
720デフォルトの名無しさん:2006/12/20(水) 09:49:17
ところどころの説明で出てくる
単相型とか多相型って言葉の意味がわからないんですが・・・
どういう意味なんですか?
721デフォルトの名無しさん:2006/12/20(水) 09:50:44
多相的に使えるとか単相的に使えるとかそういう言葉の使い方とかが
なんだかピンと来ません
簡単な例でどういう感じが単相だとか多相だとか教えていただけないでしょうか
722デフォルトの名無しさん:2006/12/21(木) 01:55:20
こういう感じが「多相的に使える」
# let make_list x = [x];;
val make_list : 'a -> 'a list = <fun>
# make_list 1;;
- : int list = [1]
# make_list true;;
- : bool list = [true]

こういう感じが「単相的」
# let make_list x = [0; x];;
val make_list : int -> int list = <fun>

(緩和された値多相とか、そーゆー難しい話はこの際抜きで)
723721:2006/12/21(木) 15:13:56
あ〜なるほど、そういうことだったのか〜
やっと、わかりました。ありがとうございました。
724デフォルトの名無しさん:2006/12/29(金) 09:37:04
こういうコードを見つけたのですが(escape_charは直前で定義されている)

let quote_string fmt s =
Format.fprintf fmt "\"%a\""
(fun fmt s ->
String.iter (fun c -> Format.fprintf fmt "%s" (escape_char c)) s) s

これって、どうして

let quote_string fmt s =
Format.fprintf fmt "\"%a\""
(String.iter (fun c -> Format.fprintf fmt "%s" (escape_char c)) s))

じゃいけないんでしょうか
なんで間に (fun fmt s -> ....)が入るのかがよくわからないのです
725デフォルトの名無しさん:2006/12/29(金) 14:50:01
下の方だと、どう型が合わないじゃん
726デフォルトの名無しさん:2007/01/03(水) 11:08:31
%aの仕様わかってる?
%aは formatter -> 'a -> unit という関数と 'a の値と二つ必要なんだよ。

# open Format;;
# fprintf std_formatter "%a";;
- : (Format.formatter -> '_a -> unit) -> '_a -> unit = <fun>

参考:ttp://caml.inria.fr/resources/doc/guides/format.html
727デフォルトの名無しさん:2007/01/03(水) 17:36:55
expression-problemってなんすか?
728デフォルトの名無しさん:2007/01/04(木) 05:58:42
ocaml用に、埋め込みocamlとかありますか。
rubyでいうところのeRubyみたいなものです。
729724:2007/01/05(金) 09:16:19
>>724-725
ありがとうございます
%a について勘違いしてました。ただ型についてはわかりましたが
formatter ってものについてまだよくわかってないみたいす
も一度勉強してきます
730728:2007/01/07(日) 06:38:41
728どなたか教えてください
731デフォルトの名無しさん:2007/01/07(日) 10:58:08
eRubyを知らんのだけどmod_camlかな?
mod_camlも別に使ったこと無いけど
732デフォルトの名無しさん:2007/01/08(月) 01:02:29
eRubyとmod_camlはぜんぜん違うと思う。

eRuby の実用途で一番近いのは camltemplate なんだけど、
http://saucecode.org/camltemplate/
こちらは OCaml のコードがそのまま埋め込まれるわけではないので少し違うしなぁ
733デフォルトの名無しさん:2007/01/12(金) 10:32:36
caml のライブラリを動的にリンクする方法ってないの?
Cでso作ってリンクするんじゃなしに
734デフォルトの名無しさん:2007/01/12(金) 10:35:59
あ、Dynlink なんてモジュールがあったんだ、これ使えばいーのか
735デフォルトの名無しさん:2007/01/12(金) 10:40:31
あーnativeコードではできないのか、残念・・・
736デフォルトの名無しさん:2007/01/12(金) 23:17:25
他言語の拡張をOCamlで書いたりしたいよねー
737デフォルトの名無しさん:2007/01/26(金) 09:50:12
共有メモリにクロージャを置く方法ってありますか
738デフォルトの名無しさん:2007/01/26(金) 23:34:43
・共有メモリをさわれるAPIがそもそもOCamlの標準にはないのではないか
・クロージャのMarshalも結構制限があるっぽい
なので難しそうな印象
739デフォルトの名無しさん:2007/01/27(土) 07:59:35
Marshalもfunctional value扱うとwarning出すし、
たしかNetshm というモジュールがなんかのライブラリにあったけど
これもMarshal同様の制限があった気がするな
740デフォルトの名無しさん:2007/01/30(火) 09:22:17
cmaとかcmxa とかに入っているライブラリのインタフェースを
エクスポートして中身を確認したいんですがどうすればよいのでしょう
741デフォルトの名無しさん:2007/01/31(水) 00:50:26
camlp4のマニュアルには、拡張構文と通常構文は相互変換可能みたいな事が
書いてあるけど、.ml の相互変換ってできるのでしょうか。
どなたか、やり方知ってたら、教えて下さいませ。
742デフォルトの名無しさん:2007/01/31(水) 02:01:14
>>737>>739
Marshal.Closures指定すればできね?
同一プログラムファイルでしか共有できないけど。
byte/native問わず3.08からはふつうに使えるはず。
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html
http://wiki.ocaml.jp/index.php?ChangesSince3.07
共有メモリを別のプログラムで使う場合はクロージャは諦めてくれ。
743デフォルトの名無しさん:2007/01/31(水) 02:09:54
>>741
camlp4 pa_o.cmo pr_r.cmo foo.ml
camlp4 pa_r.cmo pr_o.cmo foo.ml
とか?
744741:2007/02/01(木) 19:31:19
> 743
おお! そんなやり方が!
一応、マニュアルとかも斜め読みしたんですが分かりませんでした。
マニュアルよく見たら、分かりますかね。それともソースですか?
何はともあれ、ありがとうございました。
745デフォルトの名無しさん:2007/02/03(土) 10:31:29
Camlp4は苦しみぬいて分かった後にマニュアルをよーく見ると確かに分かったのと同じことが書いてある。
746743:2007/02/05(月) 21:54:37
>>744
ttp://caml.inria.fr/pub/docs/tutorial-camlp4/tutorial008.html#toc55
manualは分かりづらい。tutorial推奨。
>>745
禿同。
747デフォルトの名無しさん:2007/02/14(水) 06:26:48
FreeBSD6.2R/i386 で ocaml 実行して

% ocaml
Objective Caml version 3.09.3

# #thread;;
/usr/local/lib/ocaml/threads: added to search path
/usr/local/lib/ocaml/unix.cma: loaded
/usr/local/lib/ocaml/threads/threads.cma: loaded
# let t = Thread.create (fun () -> while true do Thread.delay 1.0 done) ();;
val t : Thread.t = <abstr>
# Thread.kill t;;
Exception: Invalid_argument "Thread.kill: not implemented".

てなるんですが Thread.kill って実装されてないんでしょうか?
748デフォルトの名無しさん:2007/02/14(水) 08:39:17
いや、実装されている。
749デフォルトの名無しさん:2007/02/14(水) 09:41:27
それじゃどうして Thread.kill が使えないのでしょうか?
あるいは thread を kill する別のやりかたはあるのでしょうか?
750デフォルトの名無しさん:2007/02/14(水) 10:47:49
メール欄見ろよ。

それからソースを見れば、
(* Thread.kill is currently not implemented due to problems with
cleanup handlers on several platforms *)
とあるのがわかる。

あと vmthread なら kill は実装されてるだろ。
751デフォルトの名無しさん:2007/02/14(水) 16:11:46
横槍だけど、、、
vmthread って light weight なスレッドだとか聞いたけど
じゃあ、ふつーの native thread って何であるの?
外部のCのライブラリとかと共存するため?

mt がらみの処理がcaml で閉じてる場合、vmthread 使ったほうが
高速なんだよね?
752デフォルトの名無しさん:2007/02/14(水) 16:27:38
>>751
native threadだと実CPUの数でパフォーマンスがあがるから。
753デフォルトの名無しさん:2007/02/14(水) 17:00:35
vmthread だと、実CPUの数でパフォーマンスがあがらないの?
754デフォルトの名無しさん:2007/02/14(水) 21:26:33
たっぷる……なんか違和感がw
それなりに使ってる人たちもいるんだろうけど、
どの界隈に多いんだろうか。
755デフォルトの名無しさん:2007/02/14(水) 22:27:57
native thread はOSが管理する→CPUの数も考慮に入れて動く?
vmthread は ocaml 上で動く → ???
756デフォルトの名無しさん:2007/02/14(水) 23:02:42
>>754
俺も思ったw
それはそうと本出るらしいね
http://d.hatena.ne.jp/sumii/20070214/p2
757デフォルトの名無しさん:2007/02/15(木) 09:49:02
スレッドを沢山はしらせるなら立ち上げのコストが高い分
vmthread の方がいいよ
758デフォルトの名無しさん:2007/02/15(木) 09:49:45
あーコストが高いのはねいてぃぶスレッドね
759デフォルトの名無しさん:2007/02/15(木) 10:11:34
マニュアルのthreadsによると、
http://caml.inria.fr/pub/docs/manual-ocaml/manual038.html
Native/vmthread関係なく複数CPUの恩恵を受けることはないと書いてある。

たしか、IO等の重い処理(正確にはleave_blocking_section()を呼ぶ処理)に対しては、実行中に他のスレッドを実行しうる。
それ以外については複数CPUで走ることはないはず。
ちょっと論点は違うけどこの辺が参考になるのではないかな。
http://alan.petitepomme.net/cwn/2006.05.16.html#5
760デフォルトの名無しさん:2007/02/15(木) 17:27:54
知らなかったorz

>>756
スレの上の方で予言してた人のはこれですかね
でもエントリの内容だけだと内容の想像が付かない
761デフォルトの名無しさん:2007/02/15(木) 21:44:18
お茶の水女子大ではOCamlを教えているんですね。
762デフォルトの名無しさん:2007/02/15(木) 21:53:36
パターンマッチ+再帰な関数を書くときに
 let hoge x = let rec loop = ... in loop
と必要なだけ引数を取ったらクロージャを作るのと
 let rec hoge x = ... else hoge x y
と変化しない引数も持って回るのとで、速度の差はあるのでしょうか?
763デフォルトの名無しさん:2007/02/15(木) 22:06:16
>>761
女が使うような女々しい言語なんかつかえるか!!!
764デフォルトの名無しさん:2007/02/15(木) 22:12:16
>>763
それじゃ女の子とどうやって話するんだ
765デフォルトの名無しさん:2007/02/15(木) 22:13:10
一つ、戸外で女と言葉を交わしてはなりませぬ。
766デフォルトの名無しさん:2007/02/16(金) 07:11:16
男女同衾を許さず
767デフォルトの名無しさん:2007/02/18(日) 15:22:55
http://www.saiensu.co.jp/?page=book_details&post_id=7751
出版社のページに目次あったよー
768デフォルトの名無しさん:2007/02/18(日) 16:02:05
これは日本語で読める初めてのOCamlの本ということになるのかな。
769デフォルトの名無しさん:2007/02/19(月) 11:10:44
>>762
本家のページに「前者のように書きたがる人が多いけど
後者の方が速いから改めよ」みたいなことが書いてあった気がする
770デフォルトの名無しさん:2007/02/19(月) 11:22:57
すいません。以下のような2つのコード

#!/usr/bin/env ocaml
print_string "hello\n";;

#!/usr/local/bin/ocaml
print_string "hello\n";;

というのを$ocaml test.mlという風に実行すると両方とも同じ結果になるんですが、
実行権をあたえて、./test.mlという風に実行するとなぜか後者だけprint_stringが見つかりません
見たいな事を言われてしまうんですが、なにか解決する方法はありませんか。
771デフォルトの名無しさん:2007/02/19(月) 11:59:22
すいません、愚かでした。
#!/usr/local/bin/ocamlrun /usr/local/bin/ocaml
print_string "hello\n";;

で、よかったんですね・・・、

これでさくらレンタルでもocaml CGIが走る!ψ(`皿´)ψウシャー
772デフォルトの名無しさん:2007/02/19(月) 12:02:06
キミはshebang行についてまず勉強しなさい。

#!から始まる先頭行の行末までをコマンドとみなして、あたかもそのコマンド
に引数を与えて実行するという機能を、UNIX系のOSでは持つ。
で、そのコマンドがそのパスに存在しないと file not found 系のエラーになる。

ということで間違いなく ocaml が /usr/local/bin にないだけだから、
which ocaml してその結果で置き換えなさい。
env コマンドが何をするものか、なぜそれだと上手く行くように見えるのか、
というのは自分で調べること。
773デフォルトの名無しさん:2007/02/19(月) 12:33:24
ガクガクガクガク(((( ;゚Д゚)))ガクガクブルブル 
774デフォルトの名無しさん:2007/02/19(月) 13:01:05
書いてある内容は基本的なことっぽいけど俺としてはこういう学術的な棚に入りそうな
本じゃなしに、例えばC++とかJavaとかの棚に入るような雰囲気の本をそろそろ出すべきだと思う
この感じだと、せっかくの入門書なのに古臭いLispの本が並ぶ棚の側に置かれそうな感じだ
775762:2007/02/19(月) 16:18:55
>>769
http://caml.inria.fr/pub/old_caml_site/ocaml/speed.html
これですね。後者のほうにしときます。ありがとうございました。
776デフォルトの名無しさん:2007/02/19(月) 17:16:28
>>772
いや違うと思うぞ。
うまくいかないのはocamlコマンドが#!で始まるスクリプトだからかな。
http://ocaml.jp/archive/ocaml-manual-3.06-ja/manual023.html
777デフォルトの名無しさん:2007/02/19(月) 22:03:12
まあ1冊目の本が出るところでそろそろもないだろう
778デフォルトの名無しさん:2007/02/20(火) 03:34:08
>>772>>776
shebang行に#!<dir>/bim/ocaml
と入れても実行できない理由は、
ocamlというファイル自体がocamlrun上で走る
バイトコードだからかなと思ったんですが、違いますかね?
実際そのように考えて、>>771のように
#!<dir>/bin/ocamlrun <dir>/bin/ocaml
としたら、うまく動いてるんですが・・・

ttp://www002.upp.so-net.ne.jp/mamewo/ml.html
779デフォルトの名無しさん:2007/02/20(火) 03:34:51
bimじゃなくてbin・・
780デフォルトの名無しさん:2007/02/21(水) 06:18:35
しょっぱ
781デフォルトの名無しさん:2007/02/22(木) 10:25:49
http://ocaml.pbwiki.com/Ocamlscript
これでも導入しとけよ。
782デフォルトの名無しさん:2007/02/23(金) 02:19:24
>>778
そうだと思う。ocamlの先頭部分をダンプすると
#!/foo/bar/ocamlrun
とか付いているし。

もう一個の実行の仕方として
#! /bin/sh
# (*
exec ocaml "$0" "$@"
*) directory "."
というのがある。
面倒なので俺も>>781使うのを推奨。
783デフォルトの名無しさん:2007/02/24(土) 20:52:52
本日サイエンス社のOcaml本買ってきました、ハードカバーなので列車内じゃ読みにくいですね(片開きみたいな持ち方ができないんで)
結構行間が空いてるのでもう一回り小さい装丁でもよかったんじゃなかろうかと思わんでもない、
内容をぱっと見してるかぎりじゃプログラム初学者から関数型を食わず嫌いしてた古参のプログラマも読める内容になってます。

784デフォルトの名無しさん:2007/03/14(水) 13:43:05
toplevel で実行すると

# [1;2;3];;
- : int list = [1; 2; 3]

とかpretty-printしてくれるけど、これと同じことする関数ってない?
785デフォルトの名無しさん:2007/03/24(土) 08:54:13
tuple -> list
list -> tuple

の相互変換をする標準関数はないの?
786デフォルトの名無しさん:2007/03/24(土) 13:49:35
>>784
Toploop.print_value
ただし使い方が難しいかも

>>785
たぶんない。型がつけられないと思われる。
Obj.magic的なことをすれば何とかなるかもしれんが。
787デフォルトの名無しさん:2007/03/27(火) 05:21:32
let list_of_tuple v = Array.to_list (Obj.magic v)
let tuple_of_list lst = Obj.magic (Array.of_list lst)
ちゃんと動くかどうかは…知らん。
788デフォルトの名無しさん:2007/03/27(火) 06:30:30
なにその何も考えてないコード
789デフォルトの名無しさん:2007/03/30(金) 07:35:08
OCaml3.10って何が変わったん?
790デフォルトの名無しさん:2007/03/30(金) 09:18:52
例外に対してコールスタックが見れるようになった
nativeコードでも見れる
791デフォルトの名無しさん:2007/03/30(金) 21:26:46
SML#0.2キター
792デフォルトの名無しさん:2007/03/30(金) 22:54:52
793デフォルトの名無しさん:2007/04/01(日) 01:28:54
SML#0.2使ってみた。
ウィンドウズでさくっと使えるので楽しげ。

SML# 0.20 (2007-03-30 10:47:08 JST)
# val x = 1;
val x = 1 : int
#

さぁ、何作って遊ぼうかなー。
794デフォルトの名無しさん:2007/04/01(日) 01:40:38
やっぱりまずはレコード多相?

# fun get_name n : string = #name n;
val get_name = fn : ['a#{name:string} .'a -> string]

おー、forallになってるお。

# get_name { name = "smlsharp", version = 0.2 };
val it = "smlsharp" : string

グレイト。まぁ、前からできるんだろうけどさ。初体験なわけよ、俺的には。
っていうか、レコードって型宣言しなくても使えるんだ。
795デフォルトの名無しさん:2007/04/01(日) 13:43:56
レコード型宣言しなくてもフィールド参照が使える(型推論できる)、ってのが
多相レコードのキモだ。
他のレコード(オブジェクト)型がある言語では「そのフィールドを持つレコード(オブジェクト)型の
宣言がないよ」って言われる。
796デフォルトの名無しさん:2007/04/01(日) 14:28:04
OK. じゃー次は噂のランク1多相だ。

#fun pair x y = (x, y);
val pair = fn : ['a .'a -> ['b .'b -> 'a * 'b]]
# pair 1;
val it = fn : ['a .'a -> int * 'a]

うん、多相になっている。OCamlなら、

# let pair x y = x, y;;
val pair : 'a -> 'b -> 'a * 'b = <fun>
# pair 1;;
- : '_a -> int * '_a = <fun>

と単相になってしまう。
ちなみに私はSML#の関係者でもなんでもないので、
広告のための自作自演ではない。あしからず。
ホントに単なる趣味です。

追加するとSML#だと、これが無理っぽい。

# fun fst (x, y) = x;
val fst = fn : ['a,'b.'b * 'a -> 'b]
# fst ([], 1);
stdIn:7.1-7.11 Warning:
dummy type variable(s) X0 are introduced due to value restriction
val it = [] : X0 list

残念。単相になってしまう。
797デフォルトの名無しさん:2007/04/01(日) 17:36:57
そういえば、SML#では32bit intは32bit intとしてそのまま使えるんだったな。
どれどれ。

# fun power (x, 0) = 1
> | power (x, n) = x * power (x, n - 1);
val power = fn : int * int -> int
# power(2, 31) - 1;
val it = 2147483647 : int

うむ、確かに。正負あわせて32bitって訳だ。
798デフォルトの名無しさん:2007/04/02(月) 22:10:19
MLのJoel Reymontという人の投稿っぷりはすさまじいな
799デフォルトの名無しさん:2007/04/03(火) 04:10:31
>>798
そいつは基地外。HaskellとかErlangのコミュでもフレーム撒き散らして迷惑かけてる。
800デフォルトの名無しさん:2007/04/15(日) 04:39:39
SML# ってドトネトなのかとオモテタ。危なくスルーする所だった。
801デフォルトの名無しさん:2007/04/15(日) 11:33:05
.net方面には SML.net と F# がある。
http://www.cl.cam.ac.uk/research/tsg/SMLNET/
http://research.microsoft.com/fsharp/fsharp.aspx

オレも誤解してた時期があったけど。でもSML#の方が .net より先なんで仕方ない。
802デフォルトの名無しさん:2007/04/15(日) 16:00:14
せっかく新しい処理系作るならマルチスレッド対応にして欲しいなあ。
マルチコアプロセッサを積んだマシンが殆どな時代だし。
803デフォルトの名無しさん:2007/05/01(火) 21:19:58
804デフォルトの名無しさん:2007/05/02(水) 01:09:29
鳥本ってあんまり良い印象無いんだけど、今度はどうなんだろう?
805デフォルトの名無しさん:2007/05/02(水) 02:32:49
HaskellとCommonLispはいまいちだった感じだよね
806デフォルトの名無しさん:2007/05/02(水) 06:26:39
807デフォルトの名無しさん:2007/05/11(金) 21:42:10
SML#からFUSEが使えた。
MLでファイルシステムを書けるなんて、鼻血が出そうだ。
808デフォルトの名無しさん:2007/05/12(土) 20:30:53
Scheme/Common Lispではなく、SML/OCamlを選んだ理由を教えてください。
809デフォルトの名無しさん:2007/05/12(土) 20:58:05
・型付きだから
・速いから
810デフォルトの名無しさん:2007/05/12(土) 20:58:59
・アルジェブライックデータタイプがあるから
811デフォルトの名無しさん:2007/05/12(土) 21:23:37
・フランス贔屓だから
812デフォルトの名無しさん:2007/05/12(土) 22:17:32
パターンマッチがあるから。
813デフォルトの名無しさん:2007/05/12(土) 22:18:59
>>808
えーっと、この変数に入ってるのはリストのリストのリストのリストの。。。。。キッーーーーー(イライラ
814デフォルトの名無しさん:2007/05/13(日) 06:34:32
>>813
おまえはオレかw
815デフォルトの名無しさん:2007/05/13(日) 07:13:51
>>813
ワロタ
816デフォルトの名無しさん:2007/05/13(日) 11:19:54
『Scheme/Common Lisp』と『SML/OCaml』の一番の違いは『動的型付け』か『静的型付け』かという点です。
817デフォルトの名無しさん:2007/05/13(日) 11:24:11
動的型付きと型なしの違いを教えてください
818デフォルトの名無しさん:2007/05/13(日) 11:52:59
『型付け』とはつまり型エラーがあるということだよ。
『動的型付け』がScheme/Common Lispの言語仕様に入ってるの?
819デフォルトの名無しさん:2007/05/13(日) 12:31:48
はい、入っています。
820デフォルトの名無しさん:2007/05/13(日) 12:33:24
OCamlは型推論を持つ静的型付け言語です。
821デフォルトの名無しさん:2007/05/13(日) 14:05:58
『形なし』の言語ってどんなの?
822デフォルトの名無しさん:2007/05/13(日) 14:11:24
scheme
823デフォルトの名無しさん:2007/05/13(日) 14:15:20
Perl とかか
824デフォルトの名無しさん:2007/05/13(日) 14:22:13
>>817
静的型付け (=変数に型がある)
- 強い型付け(即エラー), 弱い型付け(一部自動キャスト), 型推論(ひもづけるリテラル等から判断) 等で更に細分化できる

動的型付け (=値に型がある)

型なし
- BCPL、アセンブラ等
825デフォルトの名無しさん:2007/05/13(日) 14:27:41
『型なし』とは、すべての値に対してすべての操作が可能であること。
たとえば1という値に対して加算という操作ができるのであれば"a"という値に対しても加算という操作ができる。
826デフォルトの名無しさん:2007/05/13(日) 14:30:41
らむだ計算について
827デフォルトの名無しさん:2007/05/13(日) 19:11:48
OCamlがCommon Lispよりも優れている所って何だろう?
828デフォルトの名無しさん:2007/05/13(日) 19:51:21
馬鹿速い
829デフォルトの名無しさん:2007/05/13(日) 20:10:49
速いのはOCamlが静的型付け言語だからですね
830デフォルトの名無しさん:2007/05/13(日) 22:52:09
SBCLは結構速いみたいだけど
831デフォルトの名無しさん:2007/05/13(日) 23:01:20
速いLisp処理系は、オプションの型アドバイスや最適化によって
実行時型検査を省略する。
つまり、型推論と同じようなことをしている。
832デフォルトの名無しさん:2007/05/13(日) 23:04:28
SBCL は「Common Lisp として」は結構速いというだけ
Common Lisp だって静的型付けは言語でサポートされているし、
型推論をする事も可能だけど、OCaml の方が全然速い
833デフォルトの名無しさん:2007/05/13(日) 23:54:48
俺が実測した限りでは、sbclはOCamlと同じぐらい速かったよ。
型指定を山ほど書くはめになるけど。
834デフォルトの名無しさん:2007/05/14(月) 00:00:56
majisuka?
実測したのはどんな処理ですか?
数値演算系かな。
835デフォルトの名無しさん:2007/05/14(月) 01:17:22
OCamlの利点は速さ?
そりゃ速いのは助かるけど、Webアプリや業務ロジックを実装する上では
CommonLispだろーがOCamlだろーが、速さに関して特に不都合に感じない。

それよりも静的検査の強力さがOCamlの一番の特徴じゃないの?
836デフォルトの名無しさん:2007/05/14(月) 01:23:05
OCamlいいよ、適度に副作用認めてるし。
837デフォルトの名無しさん:2007/05/14(月) 01:24:31
あとは、遅延評価をデフォにしてほしい
838デフォルトの名無しさん:2007/05/14(月) 01:42:57
こいつ Lisp スレでもキチガイじみた質問してるじゃん。
どっちも気になるなら両方つかえよ。あんま相手しないほうがいいんじゃね。
839デフォルトの名無しさん:2007/05/14(月) 15:52:40
sbclは開発速度も最近かなりのものがあるから、早く速くなっていってる
ように思う。

デビアンのべんちのサイトでも確かに結果がでてる。1年前の順位とちがう。

国内で一桁しか使ってそうに無いcleanって速いみたいだね。日本のサイト
でがんばってる二人凄いと思う。出版の規格が浮かび上がればいいね。その
前にあらーんのように、ITmediaなどで取り上げてもらって、世論誘導を願
えば売れるかも。昨年はすける、今年あらーん、来年くりーんか。三拍子だ。
おきゃむるブレイクも有り得るんか。
840デフォルトの名無しさん:2007/05/14(月) 17:20:08
アーランは平行並列分散処理が得意な関数型言語として時代の要請と
シンクロしている事が人気に繋がっている訳だけど、クリーンはそういうのが
無いんだよね。元々コンカレントを意識していた筈なのに…

つーか、まともにネイティブスレッド使えるまともな関数型言語の処理系って
少ないよね
841デフォルトの名無しさん:2007/05/14(月) 17:53:01
歯ブラシがこんなにエロかったなんて・・・
http://thumb.uploda.org/file/uporg808735.jpg
842デフォルトの名無しさん:2007/05/14(月) 17:54:00
ネイティブスレッドを関数的にどう定義してあるの?<Erlang
843デフォルトの名無しさん:2007/05/14(月) 17:55:24
IOモナドつかったらhaskellでもできるんじゃね?<ネイティブスレッド
844デフォルトの名無しさん:2007/05/14(月) 18:02:23
SML 系は全滅だね
845デフォルトの名無しさん:2007/05/14(月) 18:16:46
traditional functional languageだもん
846デフォルトの名無しさん:2007/05/14(月) 21:04:58
でも開発が2005年で止まってるよ、Clean。
847デフォルトの名無しさん:2007/05/14(月) 21:06:33
cleanはもう過去の遺物でしょ。
開発を始めたのは 一時の気の迷い か 魔が差した って感じ?
848デフォルトの名無しさん:2007/05/14(月) 21:12:54
これからはHaskellの時代です。
OCaml厨の皆さん、お疲れ様でした。w
849デフォルトの名無しさん:2007/05/14(月) 21:16:38
あ〜、俺今Haskellで開発してるんだが、これは案外不便な代物だよ。
言語仕様的に、使いにくい。
OCamlの方が副作用がある分使いやすかった。
850デフォルトの名無しさん:2007/05/14(月) 21:42:15
やっぱOCamlっすよね!?
そうすっよね!?
なんちゅうか、道筋が一本しかない感じがCと違うっつぅか、
なんちゅうぁ、そこがいいんすよね。
不器用なのか糞真面目なのか、複数名で開発する場合の
保守のし易さつぅか、どう考えてもOCamlでしょ?
って感じですよねぇ。
851デフォルトの名無しさん:2007/05/14(月) 21:45:13
でもフランス人だしねぇ アメリカ人なら最高なんだが・・・
852デフォルトの名無しさん:2007/05/14(月) 22:12:32
俺が入れ込む言語は来ないというジンクスがあるのでOCamlは来ないと思う
853デフォルトの名無しさん:2007/05/14(月) 22:14:20
OCaml は見た目が汚いのが嫌;;
854デフォルトの名無しさん:2007/05/14(月) 22:21:58
Ocaml 好きだったけど >>950 みたいなのが使うのかと思うと嫌になってきた…
855デフォルトの名無しさん:2007/05/14(月) 22:50:26
>>950の汚い使い方に期待がかかる

つかMLもう来ないのかよ(´・ω・`)
856デフォルトの名無しさん:2007/05/14(月) 23:38:01
MSがF#(OCaml.NET)を開発中です。
でもC#の中に型推論を組み込むとかいってるし、
F#のほうは途中でぽしゃるような気がします。
857デフォルトの名無しさん:2007/05/16(水) 03:49:26
「MSが」でなく「MS Researchに勤める研究者が」だよ
その事実を踏まえれば途中でぽしゃるという表現がそもそもおかしい
Visual Studioに同梱されることを目指して作ってる訳ではなかろう
858デフォルトの名無しさん:2007/05/16(水) 03:58:45
>>857
一連の流れからVSシリーズに載ることなくと言う期待への裏切りがポシャることを指している事は明らかなんだからそこまで厳密に指摘するのは酷だろう。

859デフォルトの名無しさん:2007/05/16(水) 14:28:29
>>858
とりあえず落ち着けw
860デフォルトの名無しさん:2007/05/16(水) 16:02:35
Eclipseに載せる方が現実的だろ・・・実用的かどうかはさておいて
861デフォルトの名無しさん:2007/05/17(木) 03:49:36
OCamlにもSchemeのiotaみたいのがあったらなー
862デフォルトの名無しさん:2007/05/17(木) 07:33:33
http://ocaml-lib.sourceforge.net/doc/ExtList.List.html
これの List.init を使えばいいんじゃね
863デフォルトの名無しさん:2007/05/17(木) 19:36:09
List.tabulate使えばいいんじゃね?って思ったおいらはSML遣い。
864デフォルトの名無しさん:2007/05/18(金) 12:40:36
>>861
そのくらいなら、自分で作ってmy utilitiesとしてつかえばいいじゃない。
ocamlでは作成が難しいのか?
865デフォルトの名無しさん:2007/05/18(金) 21:43:44
OCaml3.10でたよー
866デフォルトの名無しさん:2007/05/19(土) 00:17:12
うっかりなんも考えずにインスコして、依存する全ライブラリを再ビルドする羽目になった
メジャーバージョンアップということ忘れてた
867デフォルトの名無しさん:2007/05/19(土) 01:18:57
* クラス内のインスタンス変数は"virtual"で宣言させられて、サブクラスに
インプリメントさせられる。その文法は "val virtual v:t"

* 事前的にバイトコードコンパイルプログラムの為だけに可能なつかまえへん例外の
バックトレースのスタックのプリントはネイティブコードにもサポートさせました。
(32/64bitのIntel/AMD & PPC)

* 新ポート:Mac OS X , PPC 74bit, PSDKツールチェインを使っとるMS Windows
64bit (x64)、VS2005 ツールチェインを使っとる MS Windows 32bit

* Camlp4プレプロセッサは部分的に再装備されて、新しいcamlp4、文法拡張の為のよ
りモジュラーなAPIに提供してる。(サードパーティの文法拡張を利用してるユーザー
はこれらの拡張が新しいAPIにポートされるまで0caml 3.09に留まる事を望むかもし
れへん。)

* 新しい試みのツール、"ocamlbuild" : OCamlアプリやライブラリを自動的に作るコン
パイルマネージャ。ドラフト文章を見ろや!ゴラッ

だそうです。
868デフォルトの名無しさん:2007/05/19(土) 22:31:06
>>867
一見機械翻訳のように見えて、実は妙に味のある訳文乙。
869デフォルトの名無しさん:2007/05/20(日) 22:53:48
SML#をMLtonでビルドしたら、動き始めがすごく早くなった
もう、NJ版は使う気になれないわ
870デフォルトの名無しさん:2007/05/23(水) 22:39:14
入門OCamlってもう出てるんですか?
871デフォルトの名無しさん:2007/05/23(水) 22:47:34
入門OCamlの感想を聞かせてもらおうか。
web情報と比べて、書籍として買うだけの価値があるかどうか。
872デフォルトの名無しさん:2007/05/24(木) 00:26:55
あそこの入門××ってシリーズはどうもいまいちなんだよな。
ocamlはどうだろね。
873デフォルトの名無しさん:2007/05/24(木) 00:36:44
ファンクタの説明が適当でワロタ
874デフォルトの名無しさん:2007/05/24(木) 00:40:29
まず、著者がろくなやつじゃねーぞ
大学生が書いてんのか、このシリーズ
875デフォルトの名無しさん:2007/05/24(木) 05:38:14
住井さんの評価はこんな感じ

「目次からもわかりますが、基本と実用のバランスが取れていて、
すごく良い感じです。」
ttp://d.hatena.ne.jp/sumii/20070523/p2
876デフォルトの名無しさん:2007/05/24(木) 06:56:41
てゆうか目次しかみてないんじゃ
877デフォルトの名無しさん:2007/05/24(木) 07:52:37
878デフォルトの名無しさん:2007/05/26(土) 00:48:36
879デフォルトの名無しさん:2007/05/26(土) 16:12:38
OCaml版もHaskell版も「っぽく」見えないのって俺だけか。
880デフォルトの名無しさん:2007/05/26(土) 18:11:29
俺も見えない。
881デフォルトの名無しさん:2007/05/26(土) 21:53:19
プログラミングの基礎 ... 基本をしっかり!?
入門Ocaml ... 実践的!?

かなり色分けがはっきりしているね。
Ocaml用に発売された最近の2冊は
882デフォルトの名無しさん:2007/05/27(日) 18:04:25
>>874
ろくでないかどうかしらないけど、立ち読みで確認したら、Ocaml開発
関係者のアドバイスも得てるみたいだね。名古屋でOcamlがはやってる
のはこの人の努力の結果なのだろうかな???

確かに、874のように経歴などでしか判断出来ないとどうしても、信頼
出来ないと思われがちだし、そんな人の方が多いし、初心者でいい本か
どうかなんてその辺からしか判断出来ないもんな。率直に言って、監修
になんでその人の名前を使わせてもらわなかったんだろうと思ったです。
883デフォルトの名無しさん:2007/05/27(日) 18:07:42
入門シリーズはほかにもあるけどOcamlが一番良く出来てるんじゃないかとも思った。
その辺は弾さんと意見は同じ。
884デフォルトの名無しさん:2007/05/27(日) 19:58:23
OCamlって正格でしょ?
言っちゃ悪いけど、言語の性格としては古いんじゃない?
885デフォルトの名無しさん:2007/05/27(日) 20:01:46
で?
886デフォルトの名無しさん:2007/05/27(日) 20:03:11
haskell使えと言いたいんだろう
887デフォルトの名無しさん:2007/05/27(日) 20:37:52
正格かどうかにこだわるのはイバラの道だよなあ
雑食が一番。
888デフォルトの名無しさん:2007/05/27(日) 21:16:06
もってけ! 884の座布団
889デフォルトの名無しさん:2007/05/28(月) 10:39:17
OCamlは記号の使い方がどうもキモくていかんな…
HaskellやSMLは気にならないんだが
890デフォルトの名無しさん:2007/05/28(月) 17:18:41
Haskellは日本語扱えません ゆにこーどだとおkだけど。
891デフォルトの名無しさん:2007/05/28(月) 20:41:04
>>890
使えるようになったの?

おいらがさわったときは漢字1文字がリストの3サイズにされてたりしたんだけど。
バージョンいくつからいけるようになったん?
892デフォルトの名無しさん:2007/05/28(月) 23:34:51
Hugsだったら大分前からほどほどには使えてる。

GHCは6.6からUnicodeなソースコードを読み込むようになった。
だけど、IOライブラリが対応しきれて無くて、
Unicodeな文字列を表示しようとしても、各文字の1バイト分ずつしか表示されない。
893デフォルトの名無しさん:2007/05/29(火) 00:18:17
>>889
俺もそう思う。でも OCaml が一番処理系の使い勝手が良さそうなんだよね。
Moscow ML って確か Caml の VM からの派生だったと思うけど、OCaml
処理系から派生した SML 処理系があったら良いな。
894デフォルトの名無しさん:2007/06/02(土) 01:48:16
C#が型推論を取り入れるらしいね
そうなったらOCamlとJAVAは駆逐されるね
895デフォルトの名無しさん:2007/06/02(土) 02:00:14
もう入ってる
896デフォルトの名無しさん:2007/06/02(土) 18:02:24
ラムダ関数も書けるなんて

(int n) => n > 0;
897デフォルトの名無しさん:2007/06/02(土) 18:04:55
レコードも書けちゃうなんて

var x = new { FamilyName = "糸色", FirstName="望"};
Console.Write("{0}\n", x.FamilyName, x.FirstName);
898デフォルトの名無しさん:2007/06/02(土) 18:59:20
>>896
型宣言とごっちゃに書かなくちゃいけないなんてきもすぎ
899デフォルトの名無しさん:2007/06/02(土) 19:20:31
このスレのレベルが急速に低下してるな……
900デフォルトの名無しさん:2007/06/02(土) 19:30:08
>>899
高度なレスをお願いします
901デフォルトの名無しさん:2007/06/02(土) 20:13:27
>>898
n => n + 1

書かなくても問題無い
902デフォルトの名無しさん:2007/06/02(土) 22:22:50
ML のスレなんだから、せめて Nemerle くらいネタにしてくれよ。C# じゃなく。
903デフォルトの名無しさん:2007/06/02(土) 22:25:03
Nemerle って、なんか日本だとマイナーだからなぁ……
まだM$謹製の F# のほうがネタにしやすい
904デフォルトの名無しさん:2007/06/02(土) 23:02:02
>>900 関わっちゃだめ!! 899 は色んなスレを同じ内容で荒している。
905デフォルトの名無しさん:2007/06/02(土) 23:58:12
そんなドマイナー言語は腐るほどあるからいちいち相手にしてらんない。
C#のようなメジャー言語がMLに歩み寄っていることの方がニュースバリューがある。
906デフォルトの名無しさん:2007/06/03(日) 00:29:01
>>905
別にマイナー/メジャーは関係ない。
有用と思われる特徴がある言語でどういう事ができるのか検証したりするとおもしろいよ。
907デフォルトの名無しさん:2007/06/03(日) 16:54:16
C++,C#,Dが型推論の導入を検討している
そしてOCamlはその役目を終えるだった
ありがとうOCaml
そしてさようなら
908デフォルトの名無しさん:2007/06/03(日) 17:00:59
その中には有望な言語が一つもないじゃん…
OCaml は無くなっても良いけど、きちんとした代わりが欲しいよ
909デフォルトの名無しさん:2007/06/03(日) 17:18:01
>>908
君のいう有望な言語を教えてほしいw
910デフォルトの名無しさん:2007/06/03(日) 18:57:43
>>909
無いから困ってるんだけどね。
911デフォルトの名無しさん:2007/06/03(日) 19:47:36
有望でないのは、プログラミングスタイルが確立されていないから。
JavaやC++ではオブジェクト指向やらUMLやらいろんな研究がされてきたけど、
関数型ではそういう積み重ねがまだまだ少ない。
これからに期待だね。
912デフォルトの名無しさん:2007/06/03(日) 20:43:35
まぁ少なくとも >>909 本人は役目とかいうレベルじゃないけどな。今も不要だし将来も真っくら。
一生非生産的な言語比較でもしてれば。別にありがくもないし、さようなら。消えて。
913デフォルトの名無しさん:2007/06/03(日) 22:13:33
なんで俺が叩かれてんだよw
914デフォルトの名無しさん:2007/06/03(日) 22:22:55
>>907=909 だと思われたんじゃないの
915デフォルトの名無しさん:2007/06/03(日) 22:28:10
どっちもうっとおしい
916デフォルトの名無しさん:2007/06/04(月) 00:40:08
4月から社会人になった。
田舎町の、40人程度の小さな会社。
20代前半の女は私だけで(そもそも女が私含め3人しかいない)最初はみんな優しかったけど、
日が経つにつれ私が仕事ができなくてどんくさいヲタ系喪女だとわかるとみんな掌を返すように冷たくなり
職場でも孤立して寂しい思いをしていた。

ある日、私が一人でバス停までトボトボ帰り道を歩いていると、同じ職場の3歳年上の技術官の人が声をかけてきた
背が高くて細身。少し頼りない感じの人だけど男と2人きりで話した事がない私は顔を真っ赤にして震えry

彼「○○(私)さん。今、帰り?」
私「は、ははははhい、、い、今kえる途中です!!!!!」
彼「仕事は慣れた?」
私「いいいいいいいいいいいえ、と、、、とんでもないです!!」

そんな感じで数日間オドオドしながら彼と一緒に帰った。さりげなくメアドも聞かれた・・・
ある日、

彼「○○さんって漫画とか好きだったりする?」
私「(興奮して)dふゅぎうjpk@pだだだだ大好きです!!!!」
彼「マジ?オタクだったりする?これから一緒に食事いかない?もっと話そうよ!」

それから彼のアパートまでいき、車に乗せてもらってヲタトークで盛り上がりながらお食事
家に帰ったら「今日は楽しかったですねーオフの日にまた何処か遊びに行きません?(^0^)」のメールが


やばい!!20で処女、友達いない、デブス、キモオタの四重苦なのにここ1週間に若い男と初めてメールの交換して、車にのっけてもらって
さらにオフの日に遊ぶ約束までしちゃったよ
今ならしねる。きみのためなら死ねる
あああああああ妄想が止まらない
917デフォルトの名無しさん:2007/06/07(木) 20:11:51
関数型言語ってナンなの?
918デフォルトの名無しさん:2007/06/07(木) 20:53:46
世界
919デフォルトの名無しさん:2007/06/08(金) 01:10:50
ナンではない。あれはパサパサしてて好かん。
920デフォルトの名無しさん:2007/06/08(金) 08:07:38
やっと "Foundations of F#" という本が届いたのだが、
どのあたりを特に勉強すればよいのだろうか。
921デフォルトの名無しさん:2007/06/08(金) 22:18:37
>>917
ナンというよりも、床の間に飾られてるうちにカチカチに干からびた正月の鏡餅。
922デフォルトの名無しさん:2007/06/10(日) 10:04:35
>>921
砕いてから油で揚げたら旨いんだぞ
923デフォルトの名無しさん:2007/06/16(土) 07:56:43
Dynamic loading of OCaml code in native code programs, through the Dynlink module.

ttp://alain.frisch.fr/natdynlink.html

来ましたね
924デフォルトの名無しさん:2007/06/17(日) 17:53:50
質問

type-preservingて日本語でどう訳せばいい?
925デフォルトの名無しさん:2007/06/17(日) 20:05:57
日本語でおk
926デフォルトの名無しさん:2007/06/17(日) 21:39:17
>>924
型保存?
927デフォルトの名無しさん:2007/06/17(日) 21:47:30
>>926
質問に質問で返すのはやめてください
928デフォルトの名無しさん:2007/06/18(月) 05:51:04
罵倒で返そうが質問で返そうが自由じゃね?
929デフォルトの名無しさん:2007/06/18(月) 08:12:30
もちろん自由です。
だから「お願い」しています。
930デフォルトの名無しさん:2007/06/18(月) 23:55:45
>>923
OCamlで書いたプラグインを受け付けるようなプログラム書けるようになるのかな?
931デフォルトの名無しさん:2007/06/21(木) 23:05:24
byte コード版は前からあった
オマケでnative の toplevel も入ってるらしいね

それと、dynlinkモジュールってライブラリファイルにリンクできないんだけど
なんでかな
実行ファイルにはリンクできるんだけど
932デフォルトの名無しさん:2007/07/01(日) 22:55:26
fold_left と fold_right で初期値とリストの適用順が逆なのは何か意味があるの?
933デフォルトの名無しさん:2007/07/02(月) 21:40:42
そのまんまやん。
934デフォルトの名無しさん:2007/07/02(月) 23:50:18
fold_leftとfold_rightの意味は分かった上での疑問ですな?

List.fold_left f a [b1; ...; bn] is f (... (f (f a b1) b2) ...) bn
hold_leftは、初期値とリストの先頭要素がfの呼び出し引数になる。
だから、aとb1をくっつける順番に引数が並ぶ。

List.fold_right f [a1; ...; an] b is f a1 (f a2 (... (f an b) ...))
hold_rightは、リストの最後の要素と初期値がfの呼び出し引数になる。
だから、anとbをくっつける順番に引数が並ぶ。

...まぁ単なる私の想像だけど。
935デフォルトの名無しさん:2007/07/04(水) 01:07:41
ありがとう
手書きで一個一個ノートに書いて展開してみたら良くわかりました
936デフォルトの名無しさん:2007/07/04(水) 02:28:13
超どうでもいいけど、今日foldとholdを間違える人を見たのは>>934で2人目だ。
937デフォルトの名無しさん:2007/07/05(木) 02:19:08
938デフォルトの名無しさん:2007/07/07(土) 15:23:46
関数型言語の勉強中です。
Ocaml でリストのシャッフルがしたい(要素をランダムに入れ替えたい)のですが、どんな書き方があるでしょうか?

とりあえず Perl での Schwartz 変換風に書いてみたのが↓ですが、こんな書き方もある、とかありましたらお願いします。
let shuffle lst =
  List.map (fun (_, x) -> x)
    (List.sort (fun (x, _) (y, _) -> compare x y)
      (List.map (fun x -> ((Random.float 1.0), x)) lst));;
939デフォルトの名無しさん:2007/07/07(土) 17:37:03
シャッフル シャッフル
940デフォルトの名無しさん:2007/07/07(土) 19:55:02
>938
>712-717
941デフォルトの名無しさん:2007/07/11(水) 15:59:38
型とか丁寧に作ったりしてる?
ひとりで書くときはいいけど、そうじゃないときは
string 2つ3つ受け取るような関数ばんばん書いたらまずいよね
942デフォルトの名無しさん:2007/07/17(火) 00:20:33
俺は、学業として始めてML言語に出会った。
それも仕方がなくである。
参考書を渡されて読んでみたが、
「なにこれ?玩具みたいな言語だな。へんてこな仕様だし。」
って思ってた。全然、必然性を感じなかったしやる気も出なかった。
でも、課題があるので仕方なくやっていた。
周りはやる気があって課題をこなしていくのに俺はまったくやる気がなかった。
だけど約1年後、
急に目覚めたのである。
うわ・・・なにこれ。パターンマッチとかポリモフィズムとか・・・特に型推論。
コンパイルが通ればほぼ動くではないか、手続き型で良く見る「セグメンテーションフォール」
が出ない・・・。
しかも何よりもうれしいのが、処理を見て関数が何をしているかではなく、
関数そのものが処理である、という事実に喜びがこみ上げてきた。
今では、現場でML言語は使われるはずもなく、JavaやC++で仕事してるが、
この時の経験は活かされてる実感がある。
世の中では必要にでも迫られなければ、ML言語などというマイナー言語を
体験する人の数も少ないのではないか。
そんな中、仕方なくから始まったものの、この言語に出会えた事を非常にうれしく思う。

ありが十々。
943デフォルトの名無しさん:2007/07/17(火) 00:23:54
×必然性
○必要性

×セグメンテーションフォール
○セグメンテーションフォールト
944デフォルトの名無しさん:2007/07/17(火) 00:35:51
学生のLispかぶれと良く言いましてな。
お仕事で揉まれるうちに、彼らが忌み嫌う副作用のほうに
計算の本質があることが分かってくるものじゃ
945デフォルトの名無しさん:2007/07/17(火) 02:52:32
>>944
計算の本質は副作用じゃなくて、副作用は我々とのインターフェースにすぎないよ。
946デフォルトの名無しさん:2007/07/17(火) 07:59:56
その我々とのインターフェイスが重要という話じゃないの。
947デフォルトの名無しさん:2007/07/17(火) 09:59:33
F#ってどうなん?
某コロシアム?でやたら使ってる人いるけどなんか微妙な気がするんだよね。
948デフォルトの名無しさん:2007/07/17(火) 12:06:14
>>946
それは実用プログラムを作りたい人の話じゃないの?
計算可能性とか研究してるからそういうのにあんまり興味ない。
949デフォルトの名無しさん:2007/07/17(火) 22:10:02
俺は実用プログラムを作りたい人だから、我々とのインターフェイスに興味がある。
それが本質かどうかは知らんけどね。
950デフォルトの名無しさん:2007/07/18(水) 19:47:57
そこで宣言的記述ですよ>我々とのインターフェイス
951デフォルトの名無しさん:2007/07/19(木) 06:58:16
>>947
.NETライブラリをばりばり使って書くと独自性がかすんで微妙に見えるかもしれないけど
言語自体はかなり野心的だと思うよ。
952デフォルトの名無しさん:2007/07/20(金) 21:58:10
微妙とか言わないで・・・。orz

>>951
今expert F#のドラフト読んでるけど確かに野心的。
でも配列系のデータ構造が
List,LazyList,Array,Seq,(IEnumerable?)...
と大量にあるのは頂けない。
953デフォルトの名無しさん:2007/07/21(土) 01:11:25
えー
マイナー言語処理系で配列表現が1つだけとかだったら
不安でしかたないと思うけど。何が頂けないの?
あと、特に読んでないけど何が野心的なの?

954デフォルトの名無しさん:2007/07/21(土) 16:44:02
入門OCaml買ったよー
色々なテクニックを知ることがでけてよかった
スレのないようにかぶるトピックもあったから
筆者はこのスレに出没してるのかな?
とりあえずいい本だった、感謝。
955デフォルトの名無しさん:2007/07/21(土) 20:18:44
>>953
>マイナー言語処理系で配列表現が1つだけとかだったら
不安でしかたないと思うけど。何が頂けないの?

そういわれればそうかもしれない。でも、なんか使いづらいんだよ。

List,LazyListはいいとしてArrayとSeqは正直違いがわからない。
知っていたら教えてください。(マニュアル嫁になるのはわかるが。)

>あと、特に読んでないけど何が野心的なの?

そうだなぁ。印象でそう感じた、じゃ答えになってないな。
OCamlの使いづらい点を改善してもっと使いやすくしてやろう、
という感じを受ける。
e.g. intもfloatで演算子(+とか)を統一,いちいち分けなくて良い。
リストじゃないけど内包表記が使える。Active pattern。

答えになっているだろうか?まだ抽象的?
956デフォルトの名無しさん:2007/07/21(土) 20:45:46
あとMatrixで線型代数が使えるのが良い。
957デフォルトの名無しさん:2007/07/21(土) 22:32:26
>954
浅井本もいいぞ。両方おすすめ
958デフォルトの名無しさん:2007/07/21(土) 23:01:52
matlabチック
959デフォルトの名無しさん:2007/07/24(火) 18:27:58
SML#あげ
960デフォルトの名無しさん:2007/07/28(土) 20:07:00
ODT (ocaml + eclipse)
http://ocamldt.free.fr/spip.php?article3
試した人いる?
961名無しさん@そうだ選挙に行こう:2007/07/29(日) 00:45:11
その手の「実用的」な話しは気取ってるんだかどうだか知らないが
スルーされるんだよ、間違いない。
962名無しさん@そうだ選挙に行こう:2007/07/29(日) 00:53:10
誰も実用していなんじゃないの
963名無しさん@そうだ選挙に行こう:2007/07/29(日) 06:14:25
ひねくれてるねえ。。コード補完やオブジェクトブラウザ,GUIエディタを備えたIDEって興奮しません?
964名無しさん@そうだ選挙に行こう:2007/07/29(日) 09:18:15
emacsに慣れちゃったからなぁ
965名無しさん@そうだ選挙に行こう:2007/07/29(日) 09:18:38
>960
使ってみたが、Macでは動かず。こっちの方が断然良い:

OcaIDE
ttp://ocaml.eclipse.ortsa.com:8480/ocaide/screenshots.html

構文エラーが下線で即座に指摘されるし、型情報をポップアップで表示してくれるし、コード補完も効くし、モジュールを修正すると勝手にインタフェースも修正してくれるし、トップレベルやocamlbrowserもついてくる。
JDTとなんら遜色はない。
不満をいえばocamlbuildやcamlp4へのオプションを与えたり、findlibを使ったパッケージのリンクとかそういうのがないとプロジェクトを共有する時などのポータビリティに欠ける。

つーかこの程度で実用的とかほざく奴ってどんな原始人だ?
966名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:02:13
>>963
>コード補完やオブジェクトブラウザ,GUIエディタを備えたIDEって興奮しません?

元Windowsプログラマーとしてはそれはあたりまえだったから興奮しない
967名無しさん@そうだ選挙に行こう:2007/07/29(日) 12:21:36
元 UNIX プログラマーとしてはそんな飾りには何の実利も無いから興奮しない
968名無しさん@そうだ選挙に行こう:2007/07/29(日) 13:13:32
Windowsプログラマは、水とIDEがタダだと思っている
969名無しさん@そうだ選挙に行こう:2007/07/29(日) 13:17:54
>>968
確かにw

UNIXプログラマは、ミネラルウォーターと、IDEは不要と来ている
970名無しさん@そうだ選挙に行こう:2007/07/29(日) 16:16:26
IDEあるとやぱり効率違うよ
おっちょこちょいの自分には。
コード補完、文法ミスを判定してくれるだけでも開発効率×2だよ。
971名無しさん@そうだ選挙に行こう:2007/07/29(日) 16:51:01
俺は人並みの注意力があるからIDEは要らないや
972名無しさん@そうだ選挙に行こう:2007/07/29(日) 18:11:28
>>970
emacsでいいんじゃない
973デフォルトの名無しさん:2007/07/31(火) 13:19:54
つまりOCaml使いはそういう人たちの集まりという事でFA?
974デフォルトの名無しさん:2007/07/31(火) 20:14:13
>>960を使ってみた。
http://uproda11.2ch-library.com/src/1119129.jpg

Ocamlのバイトコードインタプリタ実行の設定箇所はまだ空白になってた。

けっこういいかもっておもったり。
975デフォルトの名無しさん:2007/07/31(火) 20:21:21
コード補完とか記述ミス判定はもちろん、
アウトラインがあるのはけっこういいかも。
MLってletでネストしまくって訳わからなくなるときあるけど、
そういう時にね。
976デフォルトの名無しさん:2007/07/31(火) 20:45:05
取り合えずキーボードだけですべての操作ができるようにしてくれ
977デフォルトの名無しさん:2007/07/31(火) 22:29:51
>>974
日本語つかえないの?
978デフォルトの名無しさん:2007/07/31(火) 22:41:41
>>977
どこらへんが?
979デフォルトの名無しさん:2007/07/31(火) 23:51:02
>>978
>>977はコメントが文字化けしてる点を指摘してるんじゃない?
EUCだったとか
980デフォルトの名無しさん:2007/08/03(金) 17:47:40
OCaml にもLispのマクロに相当するものあるの?
981デフォルトの名無しさん:2007/08/03(金) 21:10:02
ラソチモリセウ
982デフォルトの名無しさん:2007/08/03(金) 21:41:37
ラは要らない
983デフォルトの名無しさん:2007/08/03(金) 22:37:24
Lisp のマクロには相当しないと思う
984デフォルトの名無しさん:2007/08/03(金) 23:30:26
C#つかいでF#に興味を持ってFoundation Of F#とりあえず買って読んでみてるがいまいち関数型の利点がピンと来ん・・・・
985デフォルトの名無しさん:2007/08/03(金) 23:44:46
>>984
どう書く?orgのお題から適当に見繕ってチャレンジしてみるとかどうよ?
ttp://ja.doukaku.org/challenge/

C#とOCamlの既存解答を見比べることもできるし
なんか参考になるんじゃないかね?
986デフォルトの名無しさん:2007/08/04(土) 07:48:15
>>984
F#のおいしいところはC# 3.0に取り入れられるから
将来的にはC#一本でも問題ないかと。

C# 2.0にも一部取り入れられていて、
たとえば無名delegateでブロック渡し(クロージャ)をしたり、
継続渡しなんかを意識的に使うと便利な面がある。
ttp://d.hatena.ne.jp/yaneurao/20070207
987デフォルトの名無しさん:2007/08/04(土) 08:07:21
LL魂 逝ってきまふ ノシ
988デフォルトの名無しさん:2007/08/04(土) 23:01:44
関数型の利点については素人からよく疑問にあがるところだと思うが、それについて明確な答えがでないということは
要はそれをりかいしているひとが少ないってことなんだろうね
989デフォルトの名無しさん:2007/08/04(土) 23:03:26
関数型の利点って、
副作用をできるだけ排除する癖がつくから、
デバッグの手間が減るって点だっしょ。
990デフォルトの名無しさん:2007/08/04(土) 23:33:19
例えば色々とありすぎるから一々説明すると
簡潔にまとめられないのが怪しいな・・・的な態度を取られることもあるね
一言でまとめられないと理解してくれない人に説明する気もおきないなー
991デフォルトの名無しさん:2007/08/05(日) 00:39:43
説明できないのはわかってないから(´・ω・`)
992デフォルトの名無しさん:2007/08/05(日) 02:00:34
「達人は達人を知る」的な開き直りにしか聞こえないだろうが、
説明して理解してくれる程の人ならば、既に使い始めているということ。
993デフォルトの名無しさん:2007/08/05(日) 02:07:58
>>989 の説明で十分じゃないの。
禅問答みたいな、分かれば分かる的な説明よりは断然良いと思うけどなあ。
まあ、けむに巻いた方が自己満足は大きいのかもしれんけど。
994デフォルトの名無しさん:2007/08/05(日) 03:05:13
副作用を避けるってC++でも引数の後にconst付ければ意識できるよね?
void hoge() const ←これ

クロージャの方が関数型ならではの便利さを実感できる希ガス
boostでlambdaとか問題外だし
995デフォルトの名無しさん:2007/08/05(日) 03:19:34
別にローカル変数まで const になるわけじゃないだっしょ
996デフォルトの名無しさん:2007/08/05(日) 03:23:26
ローカル変数もconstにすればいいだけでは?
997デフォルトの名無しさん:2007/08/05(日) 06:40:40
記念パピコ
998デフォルトの名無しさん:2007/08/05(日) 06:41:53
998
999デフォルトの名無しさん:2007/08/05(日) 06:44:59
999
1000デフォルトの名無しさん:2007/08/05(日) 08:58:59
>>994
まあ、C++ は参照透明な言語だからね。

ttp://d.hatena.ne.jp/w_o/20061008
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。