関数型プログラミング言語ML

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
関数型言語ML(SML/Caml/Ocamlなど)についてのスレッドです。
MLは比較的学びやすく、関数型言語を学んでみたい人にもお奨めです。

MLの魅力に取りつかれた人も、MLをこれから学ぶ人もどうぞ。


参考:リンク集
http://www.gin.or.jp/users/daikoku/lang/func/ml.htm
すでにスレ立ってますよ。

http://pc.2ch.net/test/read.cgi/tech/1002111468/l50
>>2
1じゃないけどあっちはネタスレ化してるからダメだろ
4デフォルトの名無しさん:02/01/31 11:47
>>2
あ、ほんとだ。
ごめんなさい。

・・・でも、そちらのスレは1の説明不足で、荒れ荒れになってますので、
こちらで再開した方がよろしいかと思いますが、いかがでしょう?
荒れるたびにスレたてんのか?
6デフォルトの名無しさん:02/01/31 11:51
ネタすれになってるってなんで??
7デフォルトの名無しさん:02/01/31 11:54
>>6
Meta-Language、と書いただけでスレをスタートしたので、
だれも何のことかわからなかったらしい。
>4
こっちのスレの方が荒れてる・・・
よってこっち終了w

MLスレ使い切ってもまだこっちがdat落ちしてなかったら
こっちを使おう!
10デフォルトの名無しさん:02/01/31 11:59
大堀さんの本はいいよ! 日本語の本ならこれを読むべし.

アスキーから翻訳がでているUllmanの本は内容もだめ(大御所だけど
関数型プログラミングについてはわかってないね)だけど訳もだめ.

まあ,まともにやってる人はみんなPaulsonくらい読んでるよね?
11デフォルトの名無しさん:02/01/31 12:01
>>10
大堀先生は良い人だ。
122:02/01/31 12:03
>>4
向こうのスレでも結構まともな議論がされてるように見えるのだが。
荒れてるといっても一部のレスがアレなだけだし。

まあ、こっちでやってもいいのでしょうけど
その場合は、向こうのスレにその旨を書き、
こちらへの誘導リンクを貼っておくべきかと。
13デフォルトの名無しさん:02/01/31 12:03
>>10
>アスキーから翻訳がでているUllmanの本は内容もだめ

買っちゃってるよ・・
14デフォルトの名無しさん:02/01/31 12:04
Ml for the Working Programmer
by Lawrence C. Paulson
http://www.amazon.com/exec/obidos/ASIN/052156543X/
>>10
たしかに Ullman の本の内容の薄さはやばい。
16デフォルトの名無しさん:02/01/31 12:06
>>12
勝手ながら誘導リンクを張っておきます。
MLしらないひとにもMLやって欲しいので。
(>>1のリンクは役に立つと思うので・・)
17デフォルトの名無しさん:02/01/31 12:08
>>15
確かに読んだ後、MLって割と簡単だな、とは思ったんですけど・・
18デフォルトの名無しさん:02/01/31 12:09
以前某J*ISTでの授業でやりましたが、担当の先生はUllmanの本を教科書
に指定しながらほとんど参照しませんでした。それなら買わせるなよなあ…
19デフォルトの名無しさん:02/01/31 12:12
大黒さんの初級ML講座はいつまでアルファテスト中なんでしょうか?
20デフォルトの名無しさん:02/01/31 12:16
かいじ〜んの書いてるML入門サイトには良さそうなのがあるな。
英語だから、よさ「そう」、って感じだが。
大黒さんの初級ML講座はHTML版とかも作った方がいいような。
22デフォルトの名無しさん:02/01/31 12:18
Haskellに比べると、ずいぶんと楽かも。
23デフォルトの名無しさん:02/01/31 12:27
SML97になって,value polymorphismの制限がかかってちょっと使いづらく
なった.例えば
    fun id x = x
と定義しておいて
    val id' = id id
とするとエラーになる(SML90ではちゃんと定義できる).同様に
    fun curry f x y = f (x, y)
    fun twice (f, x) = f (f x)
と定義して
    val ctwice = curry twice
とするのもだめ.

うーむ.
24デフォルトの名無しさん:02/01/31 12:32
大堀はねぇ
MLに密着しすぎ(w
25デフォルトの名無しさん:02/01/31 12:33
>>23
う〜ん、
かくなる制限はなぜに設けられたのでしょう?
なにか良いことでもあるのかな?

ML使ってるだけで、背後の理論を知らないので理由がわからぬ。
2618:02/01/31 12:36
>>23
講義でやった記憶はあるのですが説明できません。(_ _)
ghcコンパイル劇悪阻
28デフォルトの名無しさん:02/01/31 12:42
>>23
何がどう制限されたのか、はっきりとわからない(泣
MLはまだまだだ・・
29デフォルトの名無しさん:02/01/31 13:03
前スレの凄い人が戻ってきてくれることを切に願う
>>25
ポリモルフィズムと破壊的代入が相容れないからです。
もし制限が無いと例えば

let val f = ref (fn x => x) in f := fn x => x + 1; !f "abc" end

が型チェックを通ってしまう。しかしこれを実行したら整数を取る関数に文字
列が渡され、まずい。

ということで、これを回避するための制限がvalue polymorphismです。この制
限により上の例だとfは単相型しか持てなくなり、let本体で型エラーが起きる
ので、上の例は無事弾かれます。
31デフォルトの名無しさん:02/01/31 17:51
>>30
Haskell使いが聞いたら喜びそうな話だ。
32デフォルトの名無しさん:02/01/31 18:08
OCAMLって使っている人居ます?
あれってありですか?
関数型でなおかつオブジェクティブっていうのは素敵に思える反面、
じつは殺しあっていてどっちでもないという結末も想像できます。
>>32
なぜそう想像するの?
34デフォルトの名無しさん:02/01/31 22:01
>>33
関数型と、オブジェクトって相性わるそうじゃない。
それに、すんなり兼ねそなえられるなら、なぜに他の言語がそうでない?
だから無理してるのでは?
そうおもったわけ。
35デフォルトの名無しさん:02/01/31 22:03
お前等芋才
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 関数型言語
36デフォルトの名無しさん:02/01/31 22:29
大堀先生の本で勉強しています。仕事(計算機とは無縁)が忙しくて
なかなか勉強がはかどりません。専門に勉強できる学生さんがうらやましい。
最初にSMLに出会ったのはMLWorksでした。
竹内関数を実行して、そのスピードにびっくりしました。
もともとSchemeが好きでしたから、型がきっちりしているのに最初は抵抗が
ありました。しかし、今ではSMLの方が気に入っています。そして、Prologのような
パターンが使えること、モジュールが使えることなど、今まで接してきた正格な
言語では最強ではないかと思います。
再帰は強力な思考方法なので、それを活かせる言語という点でもSMLは良い言語だと
思います。
>>34
オブジェクトを入れると型システムや型推論がややこしくなるからねぇ。
Ocamlはよくやっている。

しかしたまに複雑な型システム故の理解困難な型エラーに悩まされる、時もあるが...
38デフォルトの名無しさん:02/01/31 23:44
Ullmanさんの本は内容が薄いということが言われているようですが、
関数プログラミングになじみがない方にとっては、とっつきやすい本だと思います。
この本で入門を果たした後に、Paulsonさんや、大堀先生の本に取り組めばと思います。
39デフォルトの名無しさん:02/01/31 23:55
SMLで無限リストが扱えないものでしょうか。
(大堀先生の本でもちょっと解説されていましたが)
以前、武市先生の関数プログラミングの本でラマヌジャン数を求める
MirandaかHaskellのコードが書かれた本があって気にかかっていました。
>>7
Meta-Languageでわからない奴(アホ)はこっち。
わかる人はあっち。
ここがHaskell挫折者の集いの会場ですか?
42デフォルトの名無しさん:02/02/01 14:02
age
43デフォルトの名無しさん:02/02/01 16:28
Haskellのほうが簡単ぽいのでHaskellに浮気します・・
無念。
>>39
datatype 'a inflist = Nil | Cons of 'a * (unit -> 'a inflist)
じゃだめ? (無限というよりは遅延リストだが)
45デフォルトの名無しさん:02/02/01 18:57
>>44
普通に、
(unit -> 'a inflist) を呼んだのとあまり違いがないようにも思えますが・・
44を使ったプログラムは例えば
fun nat n = Cons (n, fn () => nat (n + 1))
とか(nat 0 = [0, 1, 2, 3, ...])
fun filter p l =
case l of
Nil => Nil
| Cons (hd, tl) =>
if p hd then Cons (hd, fn () => filter p (tl ()))
else filter p (tl ())
とか(リストlをpでフィルターする)。これでいけると思ったんだけど...

>>45
>普通に、(unit -> 'a inflist) を呼んだ

??? 45流だとどうなるの?
4739:02/02/01 22:45
レス、ありがとうございます。
大堀先生の本でも同様に定義されていて、
以下p104より引用
datatype 'a inflist = NIL|CONS of 'a * (unit -> 'a inflist)
引用終わり
本を読んで、SMLでも無限リストが使えるのか、こいつはすごいと思ったものの
意味がよくわからずに深く読んでいませんでした。正格言語では無限リストの表現
は難しくなってしまうのでしょうか。「関数プログラミング」バード&ワドラーでは
では簡潔な表記になっているのですが。
48デフォルトの名無しさん:02/02/01 23:21
>>47
そんなことできるんですね。
Ullmanの本と違ってそんなことも書かれているんですね。
無限リストはLazyを拡張したMLだけが使えるものだと思っていました。
大堀先生の本は読むべきかも。
>じゃだめ? (無限というよりは遅延リストだが)
無限の実装は遅延objectですが何か?
あげ
>>50
あがってないよ大将!
といいつつ折れもsage
52デフォルトの名無しさん:02/02/02 21:57
MLをほんとに理解しようとするとラムダ計算をいずれは理解しないとって思っています。
以前、人に薦められて「プログラム意味論」(横内寛文 著)を購入しました。
第2章がそれですが、独学ではきびしいです。
「関数プログラミング」(萩谷昌己 著)あたりならなんとかかんとかです。
チャーチってコンピューター出現以前に何を夢見ていたのでしょうね? 
>>52
lispやschemeのlambdaはほぼ直感的にわかったけど、
MLとかはそんなに難しいものなの?
54デフォルトの名無しさん:02/02/02 22:13
関数プログラミングの歴史については
「特集 いま欲しいブレークスルー 関数プログラミング」(武市正人)Bit1999,3
に概略が記述されています。
それにしてもBit休刊は悔やまれます。
>>53
lambda とかの無名関数のことでなく
λ計算というモデルの話だと思われ。
5652:02/02/02 22:18
>>53
私はちゃんと学校で教わったわけではないのですが、、、。
SchemeにしろSMLにしろ関数プログラミングの根底にあるものはラムダ計算
理論と思います。そして、それはチューリング機械やゲーデルの不完全性定理
とも関連がある記憶しています。
この辺り現役で専門教育を受けている人に解説をお願いしたいところです。
>52
なんでこういう頭の硬い人が多いのかなあ・・・
5852:02/02/02 22:30
もちろん、MLでプログラムを書くのにラムダ理論はとりあえずは必要
ないと思います。(現に私はよくわかっていません。)
せっかく、MLに興味をもった人を遠ざけてしまってはいけないので、、、。
武市先生もBitの特集で言っています。
引用開始
「しかし、関数プログラミングの悲哀もまた、ここにあるのかも知れない。
関数プログラミングといえば、ラムダ計算法が顔を出すので、それとはなしに
プログラミングに興味のあるプログラマを遠ざけてしまったのではなかろうか。、、、」
引用終わり
59デフォルトの名無しさん:02/02/02 22:33
MLのソースが落ちてるところってどこかないでしょうか。
Haskellだと公式サイトにいろんなライブらいなどが紹介されていますが、
MLにそのようなものはないのでしょうか。
偉人のソースを読まないと理解は進まないと思うので。


また、MLで(ML流に)GUIのアプリをつくろうという試みとかライブラリはない
のでしょうか。GUIにかぎらずデータベースアクセスなど実用的なものについて。

普及している言語を学ぶと、最初の方に、表示やファイル操作など
「結果として成果を得る」ことや、実際に動くシステムをつくるコツなど具体的な
成果物を得ようとするトピックが必ずありますが、
関数型言語の本ではそういうものはあまり扱われていない傾向があると思います。
内部的な計算は非常に楽しく出来て、じっさい他の言語を使っていても
高階関数があればなあ、とおもったりするようになったりしましたが、
MLに戻ってくるとあまりに計算しか出来ないので悲しくなります。

MLを作っている人って、コンパイラと言語設計だけしか頭にないのでしょうか。
極端な話VBのように「実用に配慮した」りすることには全く興味はないのでしょうか。
なんか、結局他の言語の将来のこやしにしかなっていない気がしてなりません。
>58
MLの場合は単純に「何のひねりも無い名前」がかなり影響してるかと。
メーリングリストとかぶってるし(w
ML.NETって企画があった様な。
62デフォルトの名無しさん:02/02/02 23:21
>>59
VBが実用的かどうかはともかく、
>>61
ML.NETって激しく勘違いされそうな企画ではあるな(w
63デフォルトの名無しさん:02/02/03 00:16
>>59
MLでも「実際に動くシステム」はいくらでも作れるし,実際作られてるんですが.
GUIはあればあったでいいんでしょうが,なくても困るものではないし.

「他の言語の将来のこやし」というのはいいですね.確かにMLやその周辺の研究
成果はいろいろな言語の設計・実装にかなり活かされています.VBやPerl,Tcl
みたいに(少なくとも設計レベルでは)全くそういうものを活かしていない言語
が幅をきかせているのは残念ではありますが.
実際に動くってどういうこと? >>59
どんなプログラムでも仕様通りに動くんだったらそういっていいのでは?
  fun fact x = if x=0 then 1 else x*fact(x-1)
だって「x が(x!がMLで扱える整数値を超えないような)非負整数のときに
fact x はx!を与える」という仕様に従ってるわけだし。
65デフォルトの名無しさん:02/02/03 07:15
>>59
大堀先生の本の後半には実際的なプログラムの例も掲載されていますよ。

GUIについては、他のDelphiなどの言語に任せて、MLは頭脳部分にするという
方法はどうですか。うろ覚えなんですが、AMZI!Prologはそんなアプローチ
だったように思います。
http://www.amzi.com/

MLってどんな用途に使われているんでしょうね。学校での理論的な勉強、研究
はもちろんなのでしょうが、その厳格な型チェックは医療用プログラム、宇宙開発
などシビアーな用途に向いているように思えますが。
66デフォルトの名無しさん:02/02/03 07:37
私自身は計算機とは無縁な仕事についているのですが、計算機を利用はして
いるんですね。それで、その開発部隊にいたという若い人がDelphiでの開発
にあたっていたというので、先日プログラムの話で大いに盛り上がりました。
彼に大堀先生の本を見せてあげたのですが、ピンとこないようでした。
再帰の話をしても、普通はそれは使いませんよね、、てな調子でして。
まあ、それで、MLに関心のあるプログラマーの人というのは研究熱心な方
なんだろうな〜と。
まとまりのない話で恐縮です。
67デフォルトの名無しさん:02/02/03 07:59
>>66
>彼に大堀先生の本を見せてあげたのですが、ピンとこないようでした。
>再帰の話をしても、普通はそれは使いませんよね、、てな調子でして。
なんたる!
それは従来の言語のパラダイムに囚われて損をしているです。

なぜ関数プログラミングは重要か
http://www.sampou.org/haskell/article/whyfp.html

とか

Scheme(LISP)のページですけどここを読めば関数型での再帰の扱いについて
書いています。普通の言語だったら再帰はメモリ食いで良くない、
とされているんですが(じつはそれも怪しいのだが)
http://www.shiro.dreamhost.com/scheme/index-j.html の
なんでも再帰 (06/10/2001)
Schemeプログラムに氾濫する再帰に戸惑うCプログラマへ。 これであなたも再帰使い。


あと、関数型と言うと、理論のラムダ計算を思い浮かべて引く人も誤解です。
使いこなすためにマストな知識ではありません。(知っていた方が良いとは思いますが)
68デフォルトの名無しさん:02/02/03 08:36
>>65
>GUIについては、他のDelphiなどの言語に任せて、MLは頭脳部分にするという
私はMLで全部書きたいです。
他の言語と組み合わせて使うとしても、連携のための手段が少ない。

GUIが書けないと、一般に広く使われないんじゃないかと思うのです。
ML Builderなんかがあるくらいが・・

先ほど気がついたのですが、
Libraries and Tools For Haskell http://haskell.org/libraries/
Haskellならこんなにいろんなものがそろってるようです。
MLのほうが実用的だと思ってるのですが、せめてこれがMLにあればなあと思います。
69デフォルトの名無しさん:02/02/03 08:39
>>65
>シビアーな用途

シビアーな用途といえば、MLではプログラムの検証(Verification)はどうなってい
るのでしょう?
Javaですと、配列の範囲外アクセスがないということを事前検証できますよね、確か。
>>65
>シビアーな用途
噂によると、Adaは、コンパイルをちゃんと通ったプログラムは落ちないようになっているのだとか。
>>68
http://www.google.co.jp/search?hl=ja&q=SML+gtk&btnG=Google+%8C%9F%8D%F5&lr=
GTKならあるみたいですけど。
>>63
WindowsではGUIはほとんど必須のようなものでは?
UNIXでは無くても良いのですけど。
>>69
>Javaですと、配列の範囲外アクセスがないということを事前検証できますよね
exceptionは拾えるけど、事前検証なんてむりなんじゃ・・・
誰か ML で書かれたソースが落ちてるところを>>59に教えてやれよ。
73デフォルトの名無しさん:02/02/03 12:25
>>69 >>71
配列の範囲外アクセスについての事前検証はさすがにやってませんよ.特別な
場合を除いてこれをやるのは非常に難しいでしょうね.

MLはもともと検証(支援)系を作るためにできた言語なので,MLで作られた
検証(支援)系はたくさんあります.プログラム検証にも使われていますよ.
74デフォルトの名無しさん:02/02/03 12:36
>>73
MLのソースをVerificationできる方法ってありますか?
やってみたくなりました。
もしよろしければ。
75デフォルトの名無しさん:02/02/03 12:46
>>74
ええと,どういう性質について検証(verification)するのでしょうか?
型の整合性ならコンパイラがやってますが.
76デフォルトの名無しさん:02/02/03 12:53
>>75
検証に関しては厨房です、すみません。

そうですね、何ができるか解りませんが(アフォなことをかいたらすみません)
・このプログラムは有限時間内にかならず応答する。(時相理論のEventuallyみたいな)
・このプログラムのメモリ消費はかならず有限であり、ある一定地を超えない
・プロセスAとプロセスBは排他資源XYに関してデッドロックを起こさない。

・・・期待し過ぎですか?
>>67
lisp素人なんでよくわからんけど、
そこのページ(なんでも再帰のほう)の
> 開かれたループ
に載ってる例で
> (define (count-words user-char user-proc)
ってしておいて
> (else (count-words (read-char) count))))
ってのはどういうこと?
>>77
(define (count-words user-char user-proc) ... )
は、
(define count-words
 (lambda (user-char user-proc) ... ))
のシンタックスシュガーです、という風な事かな。
>>52

背景となる理論があるというのは関数型言語のセールスポイントの一つだと思っ
てます。ラムダ計算はScheme, ML, Haskellなどの非常に単純化された模型(モ
デル) なのです。そういう模型があると:

* 模型の中でプログラムがどう動くかを(リダクションとかで)手で確かめることができる
* 模型の中でプログラムに関して推論できる(2つのプログラムが等しいとか)
* 言語を拡張したら何が起こるかを、模型を使って確かめることができる
* 模型の定義は厳密で、また実際の言語の仕様よりもはるかに小さいので
だれでも同一の模型を共有できる

と、いろいろうれしいことがあるわけです。
物理理論には数学的モデルが存在するように(電磁気学にはMaxwellの方程式、とか)、
プログラミング言語にもあったっていいじゃないですか。
でもそういうのを想定せずに作られた言語の方が多い...
>>59
Ocaml(ぼそ
8177:02/02/04 11:38
>>78
考えてみたんですが、
単にバグという結論に達しました。
そもそもカッコの数あってないし(w
8252:02/02/04 20:35
>>79
レス、ありがとうございます。

プログラミングを始めた頃は理論なんか無視していました。
とりあえず、なんか動くものが作れて面白かったんですね。
その後、Schemeに出会いプログラミングと数学がコインの
表と裏のような関係にあることがわかり興味を持ちました。
ホフスタッターのGEBを読んだこともあって数学基礎論にも
興味を持ちました。
バード&ワドラーの「関数プログラミング」のカバーに書いて
あった次の言葉が気に入っています。
引用開始
関数プログラミングはプログラミングを数学的な活動として
とらえる考え方であり、、、、、」
引用終わり
83デフォルトの名無しさん:02/02/04 21:22
>>68

OCamlであれば、
Labl/Gtk や、Labl/Tk、
LablGL など、GUIをかけるライブラリは揃ってますよ。
実際、他の言語で書くよりもコーディングが楽ですし。
84デフォルトの名無しさん:02/02/05 00:03
>>83
少数派のMLの方言のCamlのさらに変種だから、敬遠してました。
いれてみよっと。

日本語通ります?
あと、ウインドウズやマック向けのアプリも書けます?
85デフォルトの名無しさん:02/02/05 00:24
>>84
http://caml.inria.fr/ocaml/distrib.html
> ウインドウズやマック
一応、コンパイラならあります。GUIはGTKやtkなら。

# WindowsでGTKってどうなんでしょう、実際。
8683:02/02/05 06:44
>> 84
もちろん日本語は通ります。
EUCならば変数名にすらできます。
(そんな面倒なプログラミングはしないけど)

ちなみに、Camlを使ってる人はほとんどいないので、
OCamlのほうが多数派です。
ただ、OOなプログラミングをするかといわれると、
その部分は使わない方が多いようです。
また、プログラミング言語関係の理論の実装では、
SMLよりもOCamlを使った実装の方が多いですね。

ウィンドウズやマック向けのアプリに関しても、
85 のおっしゃるように、gtkやtkを使えば可能です。
ウィンドウズやマックで動くOCamlは、
ftp.inria.fr/lang/caml-light
で、配付されています。
(このディレクトリ名が気になりますが)

87デフォルトの名無しさん:02/02/07 11:33
大堀先生の本をようやく手に入れました。
思いっきりTeX(笑

Ullmanの本を先に持っていて一通り読んでいたのですが、
どなたかが書かれていたとおり、あまりに内容の分量が違いました。

内容が多いだけではなくて、説明が固いので(論文のような文体です)
大堀先生の本で全くの初めての人が挑戦したら、挫折するのでは
ないだろうかとも思いました。
Ullmanの方が説明もゆっくりで、わかりやすい図もあり、なおかつ
出てくる例のプログラムのテーマが普通の人むけだともいます。

大堀先生の本、一冊すっかりこなすのは大変そうですが、
このスレに出てきた無限リストも乗ってますし、高度なプログラミン
グの例が結構乗っててなかなか良い感じです。
文法の説明だけではなく、ライブらいの使い方ものってたり、
文字列処理の具体的例がのってたり、
最後の章の実際に実用的なプログラムを一から作る例での説明
も良い感じですねえ。
一冊やりこなせば本当に使えるようになりますね、これ。
88デフォルトの名無しさん:02/02/07 22:16
大堀先生の本結構難しいね。
苦労してる。

>>1のリンク先の説明の簡単な奴がなかったらもう挫折してると思う。
89デフォルトの名無しさん:02/02/08 00:22
MLに初めて接する人のために文献の正式名称をあげときます。

「プログラミング言語ML」Jeffrey.D.Ullman 著 神林靖 訳
アスキー出版局 ISBN4-7561-1641-8

「プログラミング言語 StandardML入門」 大堀淳 著
共立出版 ISBN4-320-12024-8

「ML for the working programmer」L.C.Paulson
Cambridge University Press ISBN0-521-56543-X

「The Little MLer」Matthias Felleisen, Daniel P.Friedman
The MIT Press ISBN

「関数プログラミング」R.バード、P.ワドラー 共著
武市正人訳 近代科学社 ISBN4-7649-0181-1

「関数プログラミング」 萩谷 昌己 著 日本評論社
ISBN4-535-60817-2

「プログラム意味論」 横内寛文 著 共立出版
ISBN4-320-02657-8

90デフォルトの名無しさん:02/02/08 07:19
SMLを始めようとする人のためのエディター関係情報です。

SML/NJはコンソールアプリなので、素のままだと編集が大変です。
Emacsのようなコンソールアプリを起動する機能をもったものを
通常使っているようです。「1」のリンク先にあります。
Windowsの場合、他にXyzzyがあります。
また、Windowsの場合SML専用のものにMLEdit(1のリンク先にあり)
があります。こちらは、コンパクトなので宿題を解いたりするのに便利かも。


「コンソールアプリ」って一瞬何のことかと思ったよ.
激しく萎える言葉
ワラタ
なんで ML スレって盛り上がらないのだろう?
なんで盛り上がると思うんだ?
93はCマガかSoftwareDesignででも連載してみせろ。
2チャネラーの認識だと
「Haskelの方が逝けてる」(どうせ見得でやるだけならHaskelにしとこ)

逝っちゃってるRubyの人気がむちゃ悪いのと、似てますね。
>>93
住民が少ないから。
総勢10人ぐらいじゃないの?(藁
>95
見栄ですか…
>>95
だから、HaskellのLは2つだと口を酸っぱくして言ってるだろうが!!
MLのLが足りないとMだぞ! それでもいいのか!?
>>98
warata
100デフォルトの名無しさん:02/02/13 03:45
Haskellの方が「背伸びしたい厨房」を引き寄せる何かがあるみたいですね。

なにしろ山形・・・・・
101OOマンセー:02/02/13 04:41
関数型言語には「背伸びしたい厨房」を引き寄せるなにかがあるみたいですね。

なにしろ全角英数・・・・・
Haskellやってる奴はただの見栄っ張り。
HaskellにはRubyのように厨房を引きつける何かかあるんだよ。
だから奴らは言語的にHaskellより優れていて、
より現実的なMLを選ばずHaskellを使うんだ。

そういう理由で、厨房だらけの2chではHaskellスレが盛り上がって
MLスレが盛り上がらないのは仕方ないのだよ。

まあ、厨房共はほっといて俺等はマターリやっていこうや。
103デフォルトの名無しさん:02/02/13 05:31
Haskellには、非正格、遅延評価という通常のSMLにはない特徴があって
気にかかります。Haskellには型推論がないのかと思ったら、そうではない
のですね。
http://www.ipl.t.u-tokyo.ac.jp/~onoue/pub/jssst01.pdf
上記にあるラマヌジャン数を求める例題をみると、へぇ〜って思うのですね。

SMLはSchemeと雰囲気が似ているのが気に入っているところです。
型については全然違いますけども。
Schemeは「計算機プログラムの構造と解釈」の影響もあって普及しつつ
あるようです。SchemerがMLerになるのは自然な流れだと思いますので
MLもいずれはポピュラーになる日が来るのでは?
104デフォルトの名無しさん:02/02/13 05:37
>>102
うおー、煽るなぁあー
やめぇ!

言語的に優れてるって時点であまり正しい意見とは思えん。
MLは現実的だとは思うが、最新の研究成果などはあまり意欲的に取り
入れていない。その結果Ocamlが結構流行ってたりするんでしょうし。

でもHaskellのライブラリが沢山あったりするとこなんかはウラヤマシイ。
105Haskeller見習:02/02/13 05:39
多重定義萌〜。
106Haskeller見習:02/02/13 05:42
でもMultilevel(Multistage)言語であるMetaMLはMLベースだからなー。
MetaHaskellがないかなー(他力本願(w)。
言語の比較は関数言語スレでどうぞ
108デフォルトの名無しさん:02/02/13 12:12
ちうか、今度できるHaskellいーぞー
んでプレビュー版が Goffer って10年近く前に聞いたんすけど、、、

この10年でこの分野に変化と発展はあったのか?なかったのか?
小一時間ほど問い詰めたい...
109デフォルトの名無しさん:02/02/13 12:36
>>108
進歩と発展があったとしても、
実際のプログラミングの現場へフィードバックされてないので空しいだけじゃ。
関数型の最大の課題は使われてないこと。

現実主義のMLですら使われていないのに。
ただでさえ難解なHaskellに機能を追加しても、流行らん。

使えることを天下に喧伝する象徴的なアプリケーションが欲しいところ。
110デフォルトの名無しさん:02/02/13 12:45
研究者の間では日常のツールとして使われてますが
111デフォルトの名無しさん:02/02/13 12:50
通りかかり

>>110
それはあんまり流行ってない、とも言いませんか?
死んでないだけで。
112デフォルトの名無しさん:02/02/13 12:55
なんの研究をしていて、その研究は実務に供されるのか、
0.1時間ほど問い詰めたい、と隣の席の者が申しておりますです...
113デフォルトの名無しさん:02/02/13 13:01
普段 SML をツールに使っているものです.ソフトウェアに関する研究をしています.

ちょっとした抽象構文木(AST)を扱うようなプログラムをさっとプロトタイピング
するのにはSML, Haskellは最適ですね.Scheme, Common-Lisp でもいいけど,
静的型付けによるエラーチェックとパターンマッチングは強力.

あと,Isabelle や coq といった証明支援系を使ってちょっとした証明を作った
りしています.

以上のように,私自身の実務(=研究)に使われています.
では.さようなら.
114デフォルトの名無しさん:02/02/13 13:04
>>110
それはたぶん実際問題として
「研究所の中だけで走っている車」
みたいなものだと思います。

街中を走ってない車にはたいした意味ない。
115デフォルトの名無しさん:02/02/13 13:07
>>113
プロトタイプじゃないときは何を使ってるんですか?
116デフォルトの名無しさん:02/02/13 13:07
>>113
うわ〜ん ヽ(´ー`)ノ

>>114
あなたの言ってる事は図星でした。
117デフォルトの名無しさん:02/02/13 13:10
関数型言語は無理に普及しなくてもいいのでは? もともと研究者のための
言語という位置付けだったんだし。>>113は典型的な使い方という気がする。

>>114
車を作ったりテストしたりする道具は何も街中に出る必要はないのでは。
118通行人:02/02/13 13:12
UNIXはデスクトップでも使うべきだ、いやサーバーだけで十分。

これと同じような感じ?w
なんかですね、
「研究所の中でしか走らない車」と
「その開発のための研究所の中でしか走らない車」
しか作らない研究所
とは何だ、と思いたくもなったりしますが・・

MLでさえ「研究所の中でしか走らない車」だと言われるなら・・
>>118
UNIXはともかくサーバとして現場で活躍していますが、
MLは・・?


でも、私はMLが現場で使えたら嬉しいと思う。
MLやってからCのソースがちょっとMLっぽくなった。
でも、それだけじゃいや。
121デフォルトの名無しさん:02/02/13 13:41
だから研究の「現場」では使われてるんだって
122デフォルトの名無しさん:02/02/13 17:03
>>121
でも言語屋さんだけなんじゃないの、研究の「現場」って。
だとしたら、「研究所の外だけど、研究所の庭の中でしか走らない車」って感じじゃない?
研究は100弾を撃って1つ当たればいいんだよ。
役に立たなくても、役に立たないことが証明できれば
後の人が無駄なことをしなくて済む。

現場が使えるのが偉いというのは金になるから?
s/現場が/現場で/

>>122
請負のシステムなんて何年か何十年か使われてぽいじゃん。
と思ってしまうけどね。
まあ、日本はペーパーの数自体アメリカに比べるとはるかに少ないので
弾数すら足りてないのが現状だけども。
125デフォルトの名無しさん:02/02/13 20:30
>>123
あなたは「"カラスは黒い"という仮説」を証明するのに
「"白い蝶々"を発見する事」は役に立っていると信じますか?
>>125
つまらんレトリックはやめてくれ。
研究者がみなそんなに馬鹿だと?
>>126
研究者が皆馬鹿だとは思わないが、
とりあえず>>125のネタ元が何か
という事さえ知らない奴がいるのは
間違いないと思われ。
>>127
ヘンペルのカラスを持ってこられてれも。
単に、量化子を「あらゆる世界において」とする論理学の構造問題だよ。
カラスと蝶々に共通するものを研究する必要があればそうするし、
そうでなければしないだけ。
129デフォルトの名無しさん:02/02/13 21:34
>>128
勉強になりました。ありがとうございました。
130デフォルトの名無しさん:02/02/15 11:23
http://www.graco.c.u-tokyo.ac.jp/~igarashi/class/syslabII01.html
Ocaml の日本語でのテキストの中ではかなりよさげ。

ついでにこれも一応
http://www.ocaml.org/
>>130
とっても役に立ちそうです。
書籍はSMLしかありませんから、これは頼りになりそうです。

東大、かと思ったら教養学部ですか(汗
教養学部といっても、一般教養(1〜2年生)じゃなくて
専門課程(3〜4年生)の授業だし、経歴や論文リストを見ると
著者はこの分野のエキスパートと思われ。
この授業に教養の学生はついていけたのか?(w
133デフォルトの名無しさん:02/02/15 18:16
社会人向けのこういった講座ってないですかね?
忙しくって学校に通う時間はないので、ネットが使えるといいのだけど。
放送大学で関数プログラミングの講座とかやってないかな。

134デフォルトの名無しさん:02/02/15 18:39
大学にもぐりこんじゃえ

JAISTでO堀先生の講義を聴くのもまたよいかと
(行くのが大変だが)
ML速いよね。
136デフォルトの名無しさん:02/02/16 01:13
>>135
Cにあまり遜色無いのでかなり驚いている。
なんでもOcamlはかなり速いとか言いますね。
>> 122
おいらは言語屋じゃないけど、今では Ocaml でしかプログラム
書いてないよ。ちょっと特殊なデータ処理とか。
実行速度もそうだが、開発効率がやはり良い。

Ocaml 萌え〜
>>133>>134
ソフトウェア科学会でチュートリアルを企画してもらうのが吉かと。
誰か知り合いはいませんかね。(できれば企画委員)
139デフォルトの名無しさん:02/02/17 23:03
OCamlマンセーage
140133:02/02/18 00:01
授業料を払ってもいいので、ネットを通じてレポートを添削
してくれたり、アドヴァイスをしてくれるような教育機関が
あるとうれしいです。
我流では、なかなか進歩できないものですから。
プログラミングそのものも面白いけど、その基盤となっている
数学基礎論もちゃんと教わりたいな〜。
141デフォルトの名無しさん:02/02/19 22:53
#あっちの人だったら、基礎論なんてお茶の子のはずだし(w、
#こっちの人だったら、天然かもしれんから、レスに戸惑うんですけどぉー

>>144 数学基礎論もちゃんと教わりたいな〜。

このシリーズどうょ?
「数学基礎論へのいざない」倉田令二朗 著、河合文化教育研究所
  ttp://www.amazon.co.jp/exec/obidos/ASIN/4879999652/ref=sr_aps_d_1_1/250-6253119-5480263
>JAISTでO堀先生の講義を聴くのもまたよいかと
>(行くのが大変だが)

O堀先生って、堀先生のオブジェクト指向拡張?
λ山近辺にお住みと聞きましたが。

143デフォルトの名無しさん:02/02/20 01:03
>>141 アフォ
あっちもこっちも同じ人だよ。
144デフォルトの名無しさん:02/02/20 06:47
「プログラマのためのML/Haskel講座」
「プログラマのための数学基礎論講座」
開講きぼーん >> 偉いひと
145133:02/02/20 08:02
>>141
ありがとうございます。
早速、書店に注文します。
この本のことを検索していたら、懐かしい本を見つけました。
「真理、証明、計算」 内井惣七 著  ミネルヴァ書房
10数年前、失業していたときに読んでました。
フレーゲのこととか知ったのは、この本だったかな。
146デフォルトの名無しさん:02/02/21 05:17
漏れはこの本が好きだな。
関数型言語を基本から勉強したい人にはオススメだと思ふ。
消防な漏れでも、頑張れば理解できそうだぜ。

Information & Computing 79
プログラミング言語の意味論入門
Matthew Hennessy著 荒木啓二郎 程京徳共訳
サイエンス社 1993/12/10
147デフォルトの名無しさん:02/02/21 13:20
最近出た本で、
「史上最大の発明 アルゴリズム」 デイビッド・バーリンスキ
を読み始めてますけど、これ数理論理学、数学基礎論の流れで
書かれてます。ライプニッツ、ペアノ、カントール、ヒルベルト、
、、、という流れで。この流れ関数型言語をやっているとわかり
やすですね。命令言語だとチューリングあたりが元祖という理解
になちゃうんでしょうけど。
著者はライプニッツさんを、計算機科学の元祖とみてるようで、
モナドに悩まされるハスケラーにとっては意味深です。

関数型言語に限られるわけではない。
計算機科学を勉強していれば通常は理解は容易になる。
149デフォルトの名無しさん:02/02/21 15:11
関数型をやってて思うのですが
「関数型」という名称は適当なんだろうかと思う今日この頃。
むしろ本質を指す言葉は他にあるよな気がしてならない。
150デフォルトの名無しさん:02/02/21 18:42
命名:λ型言語

>>145-147 探して立ち読みしてみます……
151デフォルトの名無しさん:02/02/21 19:45
>>150
人型言語?入り型言語?とか言われそう。
なんてよむのこれ→λとか(笑
152デフォルトの名無しさん:02/02/21 20:35
ML,Haskell,Scheme互いに足の引っ張り合いしない。
関数型言語は仲良し。
裏を返せば、実用性なしということか。
153デフォルトの名無しさん:02/02/21 21:29
カワイソウナ >>152 ハケーン
Hennessyの本は絶版だ。
今はWinskelの本が主流。勿論英語のみ。
ただ、Hennessyの本もpdfかなんかでウェブ上にあったと思ったが。
当然英語のみ。
155デフォルトの名無しさん:02/02/22 00:42
>>152
Schemeはかなり実用に使われていますが。
156デフォルトの名無しさん:02/02/23 04:34
>>155 >>153 >>152
みなさんの「実用的な」という修飾子の定義があいまいです。

1.テキストデータを処理したり、画像や計算するのが実用的なのか?
2.GUIやネットワーク(TCP/IP)などの処理、飾りまで作れると実用的なのか?
どうでしょう?
157デフォルトの名無しさん:02/02/23 04:41
3. エロ画像の収集に使えるのが実用的なのか。
3 に 50lambda
159デフォルトの名無しさん:02/02/23 08:07
>>156
たぶん両方以上。
160デフォルトの名無しさん:02/02/23 09:12
>>159
>たぶん両方以上。

どんなの?
実用的=飯が食える
Schemeできる技術者を求めている職場がどれだけある?
たぶん、そういう意味。
俺は自分のためにSchemeを勉強しているし、仕事にも使っているが。
162デフォルトの名無しさん:02/02/23 09:20
仕事にSchemeってどんな会社?
もともと使ってた会社なのか、
それとも自分で無理やり使い出したとか?
163デフォルトの名無しさん:02/02/23 09:20
>>161
貴方みたいな人は、大体どんな職業に
ついたとしても、飯は食えます。
164デフォルトの名無しさん:02/02/23 09:23
>>162
あなたは、どんな職業でも大丈夫
とは言えないでしょう。
自分用のツールとか捨てるためのプロトタイプとか
そんなんじゃなくて、Schemeで作ったプログラムを
客に納品してるのか、どうかが知りたい。

>>164
ホットケ!
166デフォルトの名無しさん:02/02/23 09:31
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi

こんなのも作れるんだから、いけるんじゃない?
だめ? >>165
金とる巨大アプリでないと実用的なプログラムではない
という考え方がわからん。視野がせまいんじゃないの?
168デフォルトの名無しさん:02/02/23 13:07
LISPを使った超巨大なシステムは結構あるよ。
プランナーとかプロダクションシステムとかのシステムが。

あと、YahooSTOREはLISPで書かれてたような。
WhiteHouseのWebサーバーもLISPだという噂(これは自信無し)
も聞いたことあり。
>>167
誰も実用的なんていう観点は持ち込んでないんですが
>>169, SEE >>152.
171デフォルトの名無しさん:02/02/23 16:57
>>168
>プランナーとかプロダクションシステム
って何?
とりあえず『Scheme による記号処理入門』を注文してみたんだけど。
172161:02/02/23 20:03
自分で会社やってるんで、自分の問題解決に役立つ言語を選択している
だけです。見積もりの作成なんかのとき、強力な関数電卓として利用す
ることが一番多いかな。
173デフォルトの名無しさん:02/02/23 20:23
いつのまにかSchemeスレになってるー

まあ、この話題おもしろいからいいか。
漏れは、金の取れるプログラムの中に、関数型言語で書かれた
ものが少ないというのは処理系の問題だと思っている。
実用アプリを書こうとしたら、ライブラリが足りなくて
結局ライブラリを作るとことから始めなきゃいかん。
これは痛い。

Macintosh CommonLispぐらいライブラリが充実している処理系が増えるといいね。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756139264/ref%3Dpd%5Fsim%5Fb%5Fdp%5F1%5F2/249-6276606-7673106

この問題は結局、処理系作っても飯は飯は食えんというのが問題なのかもしれない。
174デフォルトの名無しさん:02/02/23 21:00
LISPとMLって使った感じが結構似てますよね。
LISPを使っている人はMLを使っている人より多いし、
LISPの方がライブラリもあるし常に書き足されている。

LISPerをMLにとりこむことは出来ないか?
使う機会がああれば、MLも手になじむと思うんですが。
175デフォルトの名無しさん:02/02/23 21:32
ML2000ってどうなっているのかなぁ?
>>173
> Macintosh CommonLispぐらいライブラリが充実している処理系
激しく同意。
(関係ないけど、今この方向ではSMLとOCaml、どちらが強いでしょう?)
> この問題は結局、処理系作っても飯は飯は食えんというのが問題なのかもしれない
確かに……。
使われない->処理系で喰ってけない->使えない->使われない
見たくもない悪循環。
176デフォルトの名無しさん:02/02/23 21:37
Alegroで自動車の衝突実験データベースのWEBシステム作って納品した話なんかが
bitにあったじゃん。自分あれ読んでSchemeはじめました(笑)。
177デフォルトの名無しさん:02/02/23 21:41
MLにAllegroCLみたいのがあったら
今すぐ買うけどなあ。
値段がACL並でも。
SML,OCamlもいいですが、
merd,Arc,他にも面白そうな言語がうまれてるんですね。
楽しみ楽しみ。っていうか私もつくりたくなってきた。
話戻るけど、
実用的っていうか業務で使うとなると保守する人が少ないってのがね…。
180デフォルトの名無しさん:02/02/23 23:39
>>178
http://merd.net/
http://www.paulgraham.com/paulgraham/arc.html
ですか? merdは初めて見ました。

>>177
ACLってどんな長所がありましたっけ
実用云々は態度で示せってとこじゃないの?
オレモナー
182175:02/02/24 00:02
>>179
見たくもない悪循環その2。
メンテ出来る人が少ない->そういうのは実務ではねぇ->使える人も使えない人も使わない->興味を持たれ難い
->メンテ出来る人が少ない

……というか、Cが強くなりすぎたんだ……。
>>182
ああ、例のやつだね。
使われない言語スパイラル。

というか別に C だけでもないでしょ?
184175,182:02/02/24 01:17
>>183
> C だけでもないでしょ?
C++もJavaもPerlも……流行る言語はC系というのが条件なのかなぁと思いまして。
それに、Cがあまりにも広く使われているために他の言語の入り込む余地が無くなっている、という考えが浮かんだんです。

でもMLの場合はCだの何だのと言う以前に関数型ですね
185デフォルトの名無しさん:02/02/24 02:00
他に保守出来る人が居ない

何やらかしても首切られない

終身雇用

(゚д゚)ウマー
186デフォルトの名無しさん:02/02/24 02:32
一部のJava上で動くLispみたいに(「ぶぶ」とか)
(LispからJavaのクラスを呼び出したり、その逆も出来る)
Javaに寄生してその辺の問題点をとりあえずは回避できないかな。
もっとも、MLの「速い」という利点は無くなっちゃいますけど。

SML.NETだとそういう状態になるのかな?
だといいんだけど。

もしそうなら
Ocaml.NETも欲しいかもしんない。
187デフォルトの名無しさん:02/02/24 03:12
>>180
今、Average Programmerのためではなく、
Good Programmerのための言語の候補となるのってなんだろう?
っていろいろ調べてるんですが、いいのご存知ありませんか?

188デフォルトの名無しさん:02/02/24 03:55
他に保守出来る人が居ない

やらかしてしまった!!

首を切られる

会社傾く

(゚∀゚)アヒャヒャー
189180:02/02/24 04:10
>>187
わたしはあまり詳しくなくて……
Good Programmer云々といった物はARCではじめて目にしたくらいなんです。
他の方情報プリーヅです。

>>186
http://www.dcs.ed.ac.uk/home/mlj/
MLjはどうですか?
> .NET
CLR(でしたっけ)はそんなに美味しい物でもないようです。
……とはいっても、無いのとは比べ物にならないだろうとは思うのですけど。
マイクロソフトリサーチにMLで有名な人が
いってなかったっけ?
191デフォルトの名無しさん:02/02/24 04:47
>>190
Haskellじゃないの?Simon Payton Jonesとか。
SML/NJならBell Labだよね。
192デフォルトの名無しさん:02/02/24 21:28
<<142
亀レスでスマソ。
O堀先生は、今は険しい道のJAISTにいらはります。
実力からして東大でも来られただろうに、なぜ好き好んでJAISTへ逝ったかは謎。
酒がうまいから?
193デフォルトの名無しさん:02/02/24 22:08
実用性云々は、技術的問題というより社会的(商業的?)問題で、ほとんどすべて単に

「MLがマイナーだから」

の系かと。プログラミング言語って社会的慣性が特に強くて(プログラマは人間だから)、
歴史を見ても研究レベルのお話が産業レベルで受け入れられるのに何十年もかかってるような。
自動メモリ管理とか抽象データ型とか。そもそも高級言語自体が出てきたときも、
「プログラムはアセンブリで書くもので、自動プログラミング(コンパイラのこと)なんて
使い物にならない」とか言われてたそうだし。それと同じじゃん?

だからあと10〜20年ぐらい待てば、MLやHaskellの要素技術も当たり前になるかと(今のままの形じゃないだろうけど)。
たとえば多相型はC++のテンプレートやJavaの汎用クラスとして取り入れられつつあるし。超スローペース&継ぎ足し的だけど…
「テンプレートの型を書くのがうざいー」とか言われ出してるから、型推論も近い…かなあ。
194デフォルトの名無しさん:02/02/24 22:21
>>190>>191

http://research.microsoft.com/ppt/

にいる人たちは、どの人もこの分野(関数型言語とか)の有名人。
195デフォルトの名無しさん:02/02/24 22:39
>>175
ML2000は俺も気になって聞いてみたことがあるんだが、
完全にアボーン状態らしい。そもそも

http://flint.cs.yale.edu/flint/publications/ml2000.html

に出てる「仕様」の案は、まだばりばりに研究途中の話ばかりで
1年や2年では実用化不可能と思われ。

研究者が自分たちで利用してる処理系はocamlにシフトしつつあるので、
復活は期待できないかと…
196175:02/02/24 23:35
>>195
どうもです。
この分野には「研究中だから駄目」というのがあったんですね。
これには思い至らなかったけど、考えてみれば当たり前のことで。
それに、研究者自身が他へ行ってしまったなら、仕方ないか。
197デフォルトの名無しさん:02/02/25 03:50
ML2000

3.1 Subtyping and subsumption
3.2 Object-oriented programming
3.3 Modules
3.4 Concurrency

3.5.1 Extensible type
3.5.2 Datatypes
3.5.3 Laziness
3.5.4 First-class Polymorphism
3.5.5 Tuples and records
3.5.6 Arithmetic
198デフォルトの名無しさん:02/02/25 18:42
ML2000って見た限りじゃ結構萌えるんですけど、
しばらくは出ないの?

早く出てくれ。
199デフォルトの名無しさん:02/02/25 20:11
自分で作ってもいいんだよ
>>199
自分も欲しいからってそんな事言っちゃってー。またまたぁー。

……ほすぃ。
201デフォルトの名無しさん:02/02/27 05:29
んげ
202John ◆0z.4Is5E :02/02/27 16:15
みなさんがMLのプログラム書くときの環境を教えてください。
ここにも・・・
204デフォルトの名無しさん:02/02/27 17:30
emacs、vim、あと
http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/index.html
これ(sml/nj専用)。……windowsならそのくらい?
わたしの場合は対話環境で色がつけばそれで良いので3つ目のを使ってます。
emacsに慣れてるんなら、それが一番いいのでは無いかと。
205John ◆0z.4Is5E :02/02/27 17:47
どうもです。
MLEditダウンロードしました。
私の場合も色がついてくれればよかったので。
206デフォルトの名無しさん:02/02/27 18:54
ocaml の emacs のモード、
色出すのに hilit 使ってるんですな。
font-lock 使った最新のはないんだろうか。
>>206
http://www-rocq.inria.fr/~acohen/tuareg/index.html.en
に無ければ、待つか自分で作るかしか無いのでは。
208デフォルトの名無しさん:02/02/28 00:39
age
209デフォルトの名無しさん:02/03/02 22:56
>204
>205
3つ目の作者です。ども。
XEmacsなどには到底及ばないのですが、イージーなところが
良いのではと一人で納得しています。
ちゃんとインストーラー(inno setup)もつけましたんで、
よろしくね。
210John ◆0z.4Is5E :02/03/02 23:55
>>209
まじっすか?
すごく便利ですよ。
もう少しML勉強したら、なんか語りましょう(w

確かオセロを作っているんでしたっけ・・・・
211John ◆0z.4Is5E :02/03/02 23:56
MLってGUI作れるんですか?
212デフォルトの名無しさん:02/03/03 02:33
>>209
Ocamlモードもつけてくださいです。
213デフォルトの名無しさん:02/03/03 06:26
>>210
オセロはとっくの昔に挫折しまして、、、。当時は演習問題を解いて
いました。Flat関数で悩んでいたのは私。前スレで解決でした。

>>212
ほんとに?
検討します。
214デフォルトの名無しさん:02/03/03 07:06
ocamlなら、
http://warplayer.free.fr/
Osiris。個人的には「GPL'ed」というのがアレですけど。
http://www.speakeasy.org/~hchomsky/ocaml-win32.html
これはWin32のAPIが使えます。LGPL。
UNIXやX用のライブラリはocamlもsmlも結構豊富にあります。

http://ocamlsdl.sourceforge.net/
開発止まってる?
216213:02/03/03 07:26
ocamlを試用してみたのですが、、、。
ocamlはどうしたらWinのコンソールで起動しますか?
PATHの設定が必要なんだろうか?
初歩的質問で恐縮です。

http://web.yl.is.s.u-tokyo.ac.jp/~ganat/ocaml/ocamltips2.htmlによると
PATHの設定 -> ocaml.exeで大丈夫なようです。

>> Fatal error: cannot open pervasives.cmi
Uncaught exception: Misc.Fatal_error
ん?
218John ◆0z.4Is5E :02/03/03 10:13
>>215
残念、間違いです。
Ocamlってオブジェクト指向の関数型でしたっけ。
まあ、よく知らないです。

で、MLのGUI情報ないですか?
>>218
自分で調べろよ
>>218
そしてこのスレに還元するんだ。
221デフォルトの名無しさん:02/03/03 11:29
>>218
二度とここに来るな
>>219-221
三連星だ
>>218
Ocamlで書かれた超有名アプリに、
MooっつうWebブラウザがあって、
Ocamlベースのアプレット(!)とか動いてたっけ。

GUIは多分/当然 tkベースだと思うが。
Win32 API wrapper や SDL ほど
高速でも最新情報でもなくてスマソ
224デフォルトの名無しさん:02/03/03 22:52
なんじゃこりゃあ?!
225223:02/03/03 22:53
なにか不都合ありましたか?
226デフォルトの名無しさん:02/03/03 22:55
早っ
227213:02/03/04 00:18
今日は家庭サービスで忙しかったもんで、今、ocamlが
MLEdit-NTで動くかどうか試していました。
system32フォルダにあるCMDを起動させておいて
ocamlを呼び出すと起動しました。Win2000の場合
には、コントロールパネルで環境変数を登録しないと
だめだそうで、CAMLLIBを設定したらOKでした。
ちょっと手直しするとcaml、ocamlもいけそうです。
こんなんでも利用価値があるのなら、なんとかしますが
マジですか?
>>212
>>214
お尻s?
229デフォルトの名無しさん:02/03/04 05:02
>>227
OcamlはMLと文法がちがうですから、
色をつけるルールをやりなおさなくてはならないと思われ。
230213:02/03/04 17:51
caml、Ocamlモードを追加しますので、下記の点についてどの資料にあたればよいか
ご教示ください。

予約語 一覧表 色分けのため
基本ライブラリの関数名 コンプリーションのデータ作成のため

コメントは (* *)でよいのかな?
ストリングは ””だよね。

231デフォルトの名無しさん:02/03/04 19:19
vim
http://www.ai.univie.ac.at/~markus/ocaml_sources/ocaml.vim
emacs, xemacs
http://www-rocq.inria.fr/~acohen/tuareg/index.html.en
この2つは予約語に、
http://caml.inria.fr/ocaml/htmlman/index.html
ocamlのマニュアル
これは基本ライブラリ一覧として、使えると思います。
232213:02/03/05 00:00
>>231

サンキューでした。
233コメント:02/03/05 00:01
(*_*)
234age:02/03/05 07:29
>>233
(*'ー`*)
235213:02/03/05 12:51
まだ、マニュアルをちょっと読んだだけだけど、
Ocamlってかなり強力な言語みたい。SML以上かな。
236デフォルトの名無しさん:02/03/05 13:12
>>235
その上にMLより速いです。
GUIも作れるようだし。
237デフォルトの名無しさん:02/03/06 07:54
これって何?Ocamlのライセンスみたいなんですけど・・
ちょっと、そりゃないんじゃないの、って感じですが。

6. You may develop application programs, reusable components and other
software items that link with the original or modified versions of the
Software. These items, when distributed, are subject to the following
requirements:

a. You must ensure that all recipients of machine-executable
forms of these items are also able to receive and use the
complete machine-readable source code to the items without any
charge beyond the costs of data transfer.

b. You must explicitly license all recipients of your items to
use and re-distribute original and modified versions of the
items in both machine-executable and source code forms. The
recipients must be able to do so without any charges whatsoever,
and they must be able to re-distribute to anyone they choose.

c. If the items are not available to the general public, and the
initial developer of the Software requests a copy of the items,
then you must supply one.
238デフォルトの名無しさん:02/03/06 10:34
原文はここ
http://camlcvs.inria.fr/cgi-bin/cvsweb.cgi/ocaml/LICENSE>>237
>>237
これは処理系そのものの制限なのでは?
「コンパイラ改造するの? いいけど、その時はソース見せてよね」といった感じの。
コンパイラはQPL、ライブラリはLGPLに手を入れたもの
(初めの方にある "As a special exception to" で始まる段を参照)
のようです。

excite翻訳ですぅ
6. オリジナルでリンクするか、ソフトウェアのバージョンを修正した適用プログラム、
再使用可能なコンポーネントおよび他のソフトウェア・アイテムを身につけてもよい。これらのアイテムは、分配された時、次の必要条件に従います:

 a. さらに、これらのアイテムのマシン実行可能な形式の受取人がみなデータ・トランスファーのコストの向こうの料金のないアイテムへの
完全な機械可読のソース・コードを受け取り使用することができることを保証しなければなりません。
 b. 明示的に、マシン実行可能なソース・コード形式中のアイテムのオリジナルで修正されたバージョンを使用し再度分配する許可を、
アイテムの受取人すべてに与えなければなりません。受取人は、チャージ少しでもなしでそのようにやっていくことができなければなりません、
また、それらは、選ぶ誰もに再度分配することができるに違いありません。
 c. アイテムが一般大衆に利用可能でなく、ソフトウェアの初期の開発者が、アイテムのコピーを要求する場合、1つを供給しなければなりません。
239238:02/03/06 10:35
原文へのリンクに「>>237」が余分に付いていました。注意。
240デフォルトの名無しさん:02/03/06 17:47
じゃあ、安心してソースを見せない商用ソフトとか、
書きまくって良いのでしょうか?

link with ってことはocamlのライブラリとか開発環境を
つくった場合にはどうなるんでしょう。

#入らぬ心配だとは言うな(笑
241gggggggg ◆gggggggg :02/03/06 17:52
hima
242grrrrrrrrr:02/03/06 18:33
http://www.kde.gr.jp/document/qpl.html
QPLの日本語訳です。
244デフォルトの名無しさん:02/03/06 21:47
>>243
GPLじゃないらしい
245デフォルトの名無しさん:02/03/07 10:25
どなたか頭のいい人、
Ocamlのライセンスの疑惑を解決してください。

きもちわるひ。
疑惑でも何でもないんじゃない?
238 が正解。コンパイラのライセンスの the Software って
のはコンパイラのことだから、コンパイラ自体のコードと
リンクしなければいいわけ。コンパイラの吐くコードに関し
ては言及していない。

普通にソフト開発するだけならば、標準ライブラリとしか
リンクしない。標準ライブラリは LGPL だったが(メーリング
リストでも議論されたけど)、商用ソフトの開発に Ocaml 使いた
いって人が標準ライブラリが LGPL じゃきついなーってんで
LGPL に手を入れたもの(リンクに関しての例外)になった。

あと、標準ライブラリにも一部ライセンスが違うものが含まれている
かもしれないことに注意(別ライセンスの C のライブラリを使ってた
りするらしい。Str モジュールとかだったかな)
247238:02/03/07 11:59
処理系の改変時にはパッチなどの形式で配布しなければならないようです。
http://www.gnu.org/philosophy/license-list.ja.html のQPLのところを参照。
その辺訂正。
248213:02/03/08 07:37
Ocamlモードを追加しました。(未完成)
Ocamlでちょっと遊んでみました。
竹内関数。インタラクティブ、コンパイラだと
SMLの方が速いようです。

let rec f(x, y, z) =
  if (x > y) then
    f (f(x-1,y,z),f(y-1,z,x),f(z-1,x,y))
  else
    y;;

fun f(x,y,z) =
  if (x > y) then
    f (f(x-1,y,z),f(y-1,z,x),f(z-1,x,y))
  else
    y;

f(12,6,0);;
249デフォルトの名無しさん:02/03/11 22:53
OCamlモード追加しておきましたよ。
こんなんでいいのかな?
250デフォルトの名無しさん:02/03/11 23:38
「数学基礎論へのいざない」倉田令二郎著 届きました。
う〜む、独習書としては??です。
シリーズ0巻、、、。
(自然数を)「1から始めるのは素人です」と言っている
タジマ先生が思い浮かびました。
251デフォルトの名無しさん:02/03/14 11:37
age
252デフォルトの名無しさん:02/03/14 22:59
http://www.bagley.org/~doug/shootout/lang/ocaml/allsrc.shtml
このページに載っているソースが物凄く汚いと思うんですけど、
Ocamlではこの書き方が普通なんでしょうか?

なんか、萎えるなあ……。
253デフォルトの名無しさん:02/03/15 00:15
>>248

> インタラクティブ、コンパイラだとSMLの方が速いようです。

ocamlの対話モードはバイトコードだけど、
sml/njのはネイティブコードにコンパイルしてるので自然かと。
254デフォルトの名無しさん:02/03/15 00:19
>>252
たとえばどの辺が?(煽りじゃなくて、純粋な質問)
ちなみに、http://caml.inria.fr/FAQ/pgl-eng.htmlに「ガイドライン」がある。
個人的意見としては、確かにsyntaxは汚いかも…と思う。
255デフォルトの名無しさん:02/03/15 00:24
>>246
ということは、いちいちどのライブラリがどのライセンスか調べて、
それに従わないといけないってことですよね?
なんだかなあ。
MSVCの方がよっぽど気楽だなあ。
256デフォルトの名無しさん:02/03/15 01:21
Ocamlのライセンスについて整理したソースが欲しい所だね。
それともメールで聞いたら答えてくれるのでしょうか?

OcamlのML・・じゃなくてメーリングリストに入っている人が(
ややこしい(笑))居られるみたいだから、その方なら簡単に
わかるのかな?
>>254
どの辺かなあ……。一行に詰め込んでいるところが沢山あるのでそう思っただけかもしれません。でもなんだか、
http://www.bagley.org/~doug/shootout/lang/smlnj/allsrc.shtml
とは違う。

>>255
そういったライブラリはどこかにリストアップされていると思います。
(そういったものの殆どがLGPLでしょうけど)
> MSVCの方がよっぽど気楽だなあ。
MSVCでライセンス関係で気にかけなければならないところってありましたっけ?
>>257
気にかけなくても良いから気楽なんでは?
>>258
「の方がよっぽど」との事なので、MSVCにも何かあるのかなあ、と。
>>257-259
SMLだろうがOcamlだろうがMSVCだろうがgccだろうが関係ないでしょ。
処理系が何だろうが、配布する時に同梱するライブラリのライセンスを確認するのは
あまりにも当然な事だと思うのだが、どうよ?
261257,259:02/03/15 12:48
>>260
当然のことです。でもOcamlの場合、処理系に同梱されているライブラリすべてが同じライセンスという訳では無いのでややこしい、というそれだけの事。
Rubyの「regex.cはLGPLなんで気をつけてね(これはそのうち無くなるらしい)」と同じような物です。
FreeBSDのgccとか
263デフォルトの名無しさん:02/03/16 10:28
age
264デフォルトの名無しさん:02/03/16 11:40
ライセンスうんぬんはocamlメーリングリストでもよく議論になってるから
程度の差はあれ、みんな混乱してるんだと思う。特にregexp関係は
そういう問題もあって、Jeromeが独自に開発中なんじゃなかったっけ。
(情報量がなくてスマソ)
265デフォルトの名無しさん:02/03/19 21:45
afe
通りすがりの者なので遅レスですが。

>>248
tuple 使わないで let rec f x y z = ...
と書いてあげれば少し速くなるはずです。
参考→http://caml.inria.fr/FAQ/FAQ_EXPERT-eng.html#curried

>>252
先頭のackermann関数しか見てませんが...
if-then-else を全部一行で書いてるとか言うのは置いといて
関数本体は、書きたければ、こう書くこともできます

let rec ack = function
 | (0, n) -> n + 1
 | (m, 0) -> ack (m - 1, 1)
 | (m, n) -> ack (m - 1, ack (m, n - 1))
267デフォルトの名無しさん:02/03/21 16:05
>>264
DLLにしてライセンス逃れするわけにはいかないの?
268248:02/03/23 08:48
>>266
カリー化すると速くなるのですね。計測しようとプログラムを書きました。
Ocamlは初めてなので拙い点はご容赦を

let timeRun f x =
  let startTime = Sys.time() in
  let _ = f x in
  let endTime = Sys.time() in
  let time = endTime -. startTime in
time;;

# timeRun f2 (12,6,0);;
- : float = 4.717


カリー化したものを計測するにはどうすれば?
考え中です。
269248:02/03/23 11:52
少々かっこ悪いですが。

let rec f x y z =
  if (x > y) then
    f (f(x-1) y z) (f(y-1) z x) (f(z-1) x y)
  else
y;;

let f3 z = f 12 6 z;;

# timeRun f3 0;;
- : float = 2.954

20年前の8ビット機に比べると現在のパソコンは
モンスターマシンですね。
270顔も名前も出さずに毎月100万円:02/03/23 11:55
    
Future-Web(フューチャーウェブ)登場
なんと10,000円単位の収入    

●10,000円単位の高収入
 1件につき最大10、000円の高額収入。月収100万円以上も可能。
●画期的なビジネス!
 インターネットを利用したこれまでにない斬新で画期的なビジネスです。
●誰でも出来ます!
 インターネットが出来る環境の方なら誰でも参加可能です。
●専門的な知識は一切不要!
 ビジネスに必要なツールはすべて当社で用意いたします。また、サポ
 ートも万全です。
●詳細は今すぐHPをご覧ください。
  http://www.future-web.tv/7823/
271デフォルトの名無しさん:02/03/24 11:42
Ocamlモードが追加されたと聞いて、馳せ参じてみましたが、
NT系版でしか使えないんですね。
ちょっと残念。
272デフォルトの名無しさん:02/03/24 12:00
CMLの使い方おせーて
273デフォルトの名無しさん:02/03/28 23:30
age
>>272
googleで調べてね
この板にも載ってるし
274デフォルトの名無しさん:02/03/29 01:22
>>250
野矢茂樹先生の本ですか??
275デフォルトの名無しさん:02/03/29 05:30
>>273

のってなか
>>273は CML を Concurrent ML ではない何かと勘違いしてると思われ。
277デフォルトの名無しさん:02/03/29 07:37
>>274
そうです。
「無限論の教室」 野矢茂樹 著 講談社現代新書
278デフォルトの名無しさん:02/03/29 07:41
>>271
Win98のAPIがいいかげんなので切り捨てちゃいました。
ごめんね。
279デフォルトの名無しさん:02/04/06 16:28
上げようか。

ついでに。
http://caml.inria.fr/oreilly-book/
オライリーのOcaml本。英語版。
http://groups.google.com/groups?safe=off&group=comp.lang.ml&num=200
comp.lang.ml。
280デフォルトの名無しさん:02/04/06 16:38
型推論がうざい。どう推論されるか知ってないとプログラムできない。
意味あんの?
281デフォルトの名無しさん:02/04/06 16:39
            ,、_  __,....,_  _,...、
            ,} {`i;:r,;'ニ (;;;;、` , r'
.            {i'  i:.'ー<.・)}:ム ヾi,
キタ━━━━━━━ノ // -r /:::ミ ('ーヽ━━━━━━━━━??!!
             i゙ i:/ /二./ /',=、__ノi/
           ヽ ヽ! {:::} //::::''´`'7!/
            ヽ、__ヽ!l::i:::::ii;;;;;;;|,ノ
               `ヽ、`ー""ヽ
                  `'ー-'''"
282デフォルトの名無しさん:02/04/06 17:34
283デフォルトの名無しさん:02/04/06 17:48
>>280
型推論?
結構簡単なシステムだよ。(って知ってるか)
うざかったら型を書けば良い。
なにか問題あるか?
284デフォルトの名無しさん:02/04/06 17:53
>>283 型書いたらMLじゃなくても良いじゃねーか。
だから意味あんのか?と。
285283:02/04/06 18:01
>>284
MLを使う理由って型推論があるから?
違うんじゃない?
286デフォルトの名無しさん:02/04/06 18:18
しかし、型推論があるのに使わないというのは気持ち悪い
おいおい、プログラム=証明を書いておきながら、型=命題が
わかっていないってことは、プログラマとしてアボーンだよ。
型推論なんかあってもなくても本質的な違いはない。それよりは、
静的型チェックがあることが重要
288287:02/04/06 18:54
上は >>280
289デフォルトの名無しさん:02/04/06 19:03
たぶん型推論は、こんな簡単な関数に型を書く必要なんて無いよ!
っていうものに使うんでしょうね?
型を書かない方が良い(柔軟性が高まる?)ばあいもあるのかな?

個人的には関数内で書く関数は、型を書きたくないね。
λっぽくない
290280:02/04/06 19:29
>>287 本質的な違いがなけりゃいらないんじゃねーの?意味あんの?
291デフォルトの名無しさん:02/04/06 20:39
というか型は命題なんだろうか?
プログラムは証明なんだろうか?
ちがうと思う。

プログラムはプログラム。型は型。
それ以上でもそれ以下でもないと思う。
292デフォルトの名無しさん:02/04/06 20:45
ほとんどの証明には間違いがあるということだな。
293デフォルトの名無しさん:02/04/06 20:47
>>292
どういう意味?
294デフォルトの名無しさん:02/04/06 21:05
ほとんどのプログラムには間違いがあるということだ
295デフォルトの名無しさん:02/04/06 21:10
みずほ銀行もねー
>>280は ML 知らないのだろ。
>>296
禿同。
MLの型推論は関数の定義において冗長な型宣言が
不要だというだけだものね。
298280:02/04/07 19:04
やはりいらないんじゃないか。
299287:02/04/07 19:15
>>280
だからはじめから型推論は必要だなんていってないってば!
少し便利になるのは >>297 が指摘したとおり。
300デフォルトの名無しさん:02/04/07 21:35
>>298 >>280
要らないから無くせというのは短絡的過ぎない?

要らないものは無くせというなら自分も無くなせば?
必要不可欠な人間なんて居ないないんだから。
301280:02/04/07 21:53
俺は俺にとって必要不可欠なんだよ!そんなことより、型推論は必要ない
ということでいいんだな?ちょっと便利なだけってことだな?じゃやっぱ
いらねーや。うざい。
302デフォルトの名無しさん:02/04/07 21:58
C,C++,Perl,Prolog,Lisp等など
他の言語使えば?
303デフォルトの名無しさん:02/04/07 21:59
MLを実際に使ってれば当たり前の事がわからないとは。

使ってから書け。
304デフォルトの名無しさん:02/04/07 22:06
>>301 >>280
君が自分にとって必要不可欠だといっても
他の人から必要不可欠というわけではないだろうねー。
型安全を保障するのに型推論は不可欠なのであ?
306デフォルトの名無しさん:02/04/07 22:20
>>305
なぜ?
307デフォルトの名無しさん:02/04/07 22:22
型はプログラムを安全に&思ったとおりに動かすためのシステム。
ポインタ(MLだとref)と整数をプログラマが知らず知らずのうちに間違えてないかとか。
型システムには静的な型システムと動的な型システムがあって、
実行時(動的)に型を確かめるか、コンパイル時(静的)に型を確かめるかが違う。
MLのように静的に型を確める機能をつけると言語に対する制約が強くなるけど、
実行時の型検査がいらなくなるからプログラムは早くなる。
schemeとかperlは実行時に型検査をしなくちゃいけないから遅い。
C言語はちゃんとした型システムがないから動作が危険。
うんちくでした。
簡単にいうと安全で効率よく実行できるってのがMLの型規則の意味。
308デフォルトの名無しさん:02/04/07 22:30
>>307
型安全だからといっても、プログラムが安全という訳じゃないと思う。

>schemeとかperlは実行時に型検査をしなくちゃいけないから遅い。
別に、致命的に遅いっていう訳じゃないなら問題ないのでは?
入り口の一箇所でチェックすればいいんだし。
309デフォルトの名無しさん:02/04/07 22:40
>>308
安全の定義によるけど、とりあえずsegmentation faultを起こすようなメモリアクセスは回避できる。
その程度の安全の保証ってことね。無限ループの検出なんかはもっとflow-sensitiveにやんなきゃできないしね。
Cでよくあるsegmentation faultとかバスエラーなんかはC言語の外のバグでOSが検出してんだけど、そういうの
をどうにか言語の中で検出しようって感じ?

遅いのは別に問題っていってないけど、速いってのは遅いってのよりもいいでしょ。
言語の自由さよりも速さを重視してる。
あと入り口の1箇所(関数のはじめとか?)でチェックするだけじゃ駄目な場合もいっぱい。
310308:02/04/07 23:02
>>309
>遅いのは別に問題っていってないけど、速いってのは遅いってのよりもいいでしょ。
たしかに。

コンパイル時にチェックできるのが型だけっていうのが寂しいねー。
コンパイル時に表明がチェックできれば良くなるような気が。
誰か表明の推論エンジン作ってくんないかな?
小規模の言語で無いと出来ないだろうけど。
311デフォルトの名無しさん:02/04/07 23:02
>>309
> Cでよくあるsegmentation faultとかバスエラーなんかはC言語の外のバグでOS
> が検出してんだけど、そういうの
> をどうにか言語の中で検出しようって感じ?
その考えで出来た高級アセンブラって無い物なんだろうか?
Cを駆逐できるほどの……。
312デフォルトの名無しさん:02/04/07 23:05
>>311
なんかTAL(typed assembly language)っていう型付きのアセンブラ言語があった気が。
Javaのバイトコードも一種の型付きマシン語と見なすこともできると思う。

表明ってなんですか?
313デフォルトの名無しさん:02/04/07 23:15
型推論システムがあるから、自分の意図とコードの差異をチェックできるので
便利と思ってます。
314デフォルトの名無しさん:02/04/07 23:38
>>312
Eiffelの表明のことです。
JavaのAssert文でも良いです。
プログラムが正しく動く条件を外部に表明すること。
315デフォルトの名無しさん:02/04/07 23:53
>>314
型に情報を付加してそれをflow解析する論文があったような。
File型からreadするときにちゃんとread用にopenされてるかどうか
コンパイル時にチェックできるやつが。
316デフォルトの名無しさん:02/04/08 00:11
>>315
どんな論文?
タイトルとか書いた人とかURLとか教えてくれるとうれしーなー。

型に情報を付加するというのは良いアイデアだと思う。
多相型かたに型以外のものが付加できるようにするというのも
面白いかもしれない。
317デフォルトの名無しさん:02/04/08 00:12
>>316
Flow-Sensitive Type Qualifiers
Jeffrey S.Foster, Tachio Terauchi, Alex Aiken
でも落ちてるとこが見つからない。なんでだろ?
僕はどこから落としたんだろう?
ごめんなさい。
たちお?
319316:02/04/08 00:21
ありがとー。
googleで検索かけたら
Jeffrey S.Fosterさんとnecのページに載ってました。
これから落として読んでみます。
ttp://www.cs.berkeley.edu/~jfoster/
ttp://citeseer.nj.nec.com/492179.html
320305じゃないけど:02/04/08 01:15
>>306
型推論が無いとコンパイラは型エラーだしてくれないのでは?
もしくは片っ端から型を宣言するか。
321デフォルトの名無しさん:02/04/08 18:44
>もしくは片っ端から型を宣言するか。
これでいいじゃないか?
322デフォルトの名無しさん:02/04/08 19:06
>>321 禿同
>>310
構成的プログラミングを使え、なんてのはどうでしょう?
Coqのextraciton
>>321
多相型を捨てるのか?
たとえ明示的に型を宣言しても、
型変数を使うかぎりは型推論のお世話にならざるを得ないだろ。
324デフォルトの名無しさん:02/04/08 19:18
>型変数を使うかぎりは型推論のお世話にならざるを得ないだろ。
えっ?
型変数に型推論は必要ないでしょ?
C++やEiffelは総称(型変数)があっても型推論は無いでしょ?
型変数も変数なんだから、外部から型を与えてあげればイイ。
325デフォルトの名無しさん:02/04/08 19:50
CMLをウィンドウズで立ち上げるほうほうおしえて栗
「他で代用できる」は、「必要無し」とはちょと違う気がする…
327デフォルトの名無しさん:02/04/08 20:57
>>326
要は実用上の問題ということ
328デフォルトの名無しさん:02/04/08 21:00
なんか微妙に荒れてるが、

(a) MLでは、型推論を使わないで明示的に型を書く「こともできる」
(b) C++では、型を明示的に書か「なければならない」

よって必然的に、少なくとも (a) >= (b)

で、C++のテンプレートライブラリとかをヘビーに使ってればすぐにわかるが、
総称型なんかを明示的に書くのは超激うざい。

よって (a) > (b)

で、型推論がいらないと言ってる今までのカキコはすべて
根本的な事項を誤解してるので、勉強してから出直してきてよし。
もっとまともな批判なら、みんなも真摯に対応すると思われ。
(今でも十分に真摯だが)

終了〜
329デフォルトの名無しさん:02/04/08 21:06
>>328
> 型推論がいらないと言ってる今までのカキコ
試験の○×問題に採用しようYO!
330デフォルトの名無しさん:02/04/08 21:15
>>321
 # let id (x : 'a) = x ;;
 val id : 'a -> 'a = <fun>
とか
 # let id : 'a -> 'a = fun (x : 'a) -> x ;;
 val id : 'a -> 'a = <fun>
とか。
>>328
確かに型推論がないと、これだけでもすでにうざい気が…
誰かC++で同じこと書いてみて
331デフォルトの名無しさん:02/04/08 21:18
ML勉強しようと思ってるんですが、関数型言語は
ど素人です。北野さんのHPで勉強は十分でしょうか?
しかし、型推論はそのアルゴリズムが必ずしも
完全なものではないし、
明示的な型宣言をした方が
確実にプログラマの意図通りに動くという事は事実なので、
あくまでも補助的な手段に過ぎないともいえる。
333デフォルトの名無しさん:02/04/09 00:11
> しかし、型推論はそのアルゴリズムが必ずしも
> 完全なものではないし、

例えば?
MLの型推論は完全だとでも言うのかな?
>>335
MLの型システムに対しては完全だろ?
337334:02/04/09 15:18
>>335
うん。言う。
とりあえず俺は何が不完全なのかさっぱり検討がつきません。
何が不完全なんですか?
339デフォルトの名無しさん:02/04/09 16:48
>>337
わかってから言ってくれよ。

338を探したけど、milnerの型システムで推論できない例が見つけられない。どれだ?
SMLではできない例はいっぱいあったけど、SML/NJではできるのしかなかった。
は?
milnerの型推論機構が不完全であることは前提だと思っていたが?
その話なのか?
MLの型推論の話なんだろ?
341名無しさん@お腹いっぱい。:02/04/10 00:49
型推論やだって言ってる奴は、
暗黙の型変換のない言語を普段使っているのか?

俺は暗黙の型変換の方がうっとうしいが。
継承関係にない型同士の暗黙の型変換はいらん。
342デフォルトの名無しさん:02/04/10 01:36
>>340はなんの噺を期待してるのか。

>>341
int -> double みたいのもいらん?
ん?
そのままだが。
milnerの型推論が完全であるかのような話をしているので
で、実用上、困ったことになったんですか?
人間の目にも明らかな冗長な型宣言を省略する場合に、
SML/NJの型推論がうまく機能しないケースがあると?
具体的な例があると嬉しいと思ったり。
346デフォルトの名無しさん:02/04/10 16:41
>>336が正しい。MLでは、人間が手で型を書いて通るプログラムなら、
自動的に型推論させても必ず通る。不完全だと言ってる奴は、
「完全」の意味を勘違いしていると思われ。

もちろん、ある種の特殊な拡張は別ね。OCamlのObjectのcoercionとか。
347デフォルトの名無しさん:02/04/10 17:15
要するに明示的な型宣言をして通るプログラムならば、
型推論でも必ず通るという意味なのかな?
348346:02/04/10 17:41
そう。>>347
349デフォルトの名無しさん:02/04/10 21:04
型推論の結果が期待どおりとはいかない場合があったような?
たしか、この板のどれかのスレに実例が載っていたはずなのだが・・・
見つからん。どこいったー。

でもサブタイプは型推論にとって鬼門だと聞いた時があるけどなー。
(でもサブタイプでも問題なく、期待通り推論してくれるアルゴニズムを書いていた論文があったような気が)
俺は完全性を、
あらゆる式について型付け可能である性質という意味で
使用していたが、
その意味では当然milnerの型推論は完全ではない。
一方で、346の言うような意味において完全と言ったとしても、
結論は同じだ。
つまり、milnerの型推論で型付けできないもので、
型検査の通る式は存在する。

どちらの意味に取ったとしても不完全だ。
>>350
で、MLの正しい式で
・MLの処理系の型推論では型付不能
・型検査を通るがMLの処理系では型推論できない
にあてはまる具体例をそれぞれ示してくれい。

(「あらゆる」って、まさか「milnerの型推論ではC#の型付ができない」とかいう
アフォな事いってるんじゃないよな?
MLの型推論の話なんだから、MLの型推論ではMLプログラムの型付ができない
って話なんだよな?)
ん?
君は教えて君ですか?
353346:02/04/11 11:37
>>349
何かの間違いか、その「期待どおり」の「期待」がそもそもおかしいか、どちらかと思われ。

>>350
> 一方で、346の言うような意味において完全と言ったとしても、
> 結論は同じだ。
> つまり、milnerの型推論で型付けできないもので、
> 型検査の通る式は存在する。
だから(少なくともcoreの)MLではそんな式は存在しないことが数学的に証明されてるんだってば。>>351の言うとおり。
なんつーか、こいつは真性のアフォか、わざと事実に反する仮定にもとづいて煽るためだけに発言している
としか思えないので、構っていると何ら有意義な議論ができないから、今後は放置の方向で。
354デフォルトの名無しさん:02/04/11 11:44
スレが盛りageられるし、みんなの勉強というか理解度のテストになるから
もっとじゃんじゃんやろうよ。(w
355デフォルトの名無しさん:02/04/11 11:55
# fun id -> (id 123, id "abc") ;;
Toplevel input:
# fun id -> (id 123, id "abc") ;;
             ^^^^^
This expression has type string but is here used with type int

みたいなのかな?>期待に反する例

で、もちろん、型推論がなくても駄目なものは駄目。

# fun (id : 'a -> 'a) -> (id 123, id "abc") ;;
Toplevel input:
# fun (id : 'a -> 'a) -> (id 123, id "abc") ;;
                    ^^^^^
This expression has type string but is here used with type int

[問] なぜでしょう。(10ドラクマ)
356デフォルトの名無しさん:02/04/11 11:56
MLは、
mycroft/milnerの型システムは使っていないのか?
使っていると思っていたんだが。
357デフォルトの名無しさん:02/04/11 12:03
それから、別に理解不足だと思っていないが、
仮にそうであったとしても、
それを以ってしてアフォとか言うなよな。
2ちゃんであったとしても品性が疑われないというわけではない。
358デフォルトの名無しさん:02/04/11 12:04
>>356
使っていません。MLの型システムはHindley-Damas-Milnerです。
Mycroft-Milnerの型推論はundecidableなので。

[問] 上の二つの型システムは何が違うか調べよ。(10ガバス)
359デフォルトの名無しさん:02/04/11 12:08
理解していなくて、しかも自覚していないのはアフォ以外の何者でもないだろう。
それを指摘して疑われるような品性だったら、ないほうが良い。
360デフォルトの名無しさん:02/04/11 12:27
ただでさえMLは少数派なんだから、ちょっとぐらい誤解してても
寛容になってあげないと、永久に普及しないよ(笑)。
もっとマターリと盛りageようYO!
そうか、分かった
>>355
> # fun (id : 'a -> 'a) -> (id 123, id "abc") ;;

id 123では 'a = int
id "abc"では 'a = string
当然型エラーだわな。
MLの言語仕様と完全に一致しているし、型推論が正しく実行されているいい例だよな。
>型推論が正しく実行されているいい例だよな。

型推論は正しく実行されている?
型推論できるかどうかの例なのに、
正しく実行されているかをどうして問題にする?
364デフォルトの名無しさん:02/04/11 22:00
355 はただ単にMLの型がよくわかってないやつなんじゃないのか?
それは勉強するときによく引き合いに出される例じゃないか。
で、型推論に失敗するサンプルは?
>>363
型推論が正しく実行された結果、
問題の式には型エラーがあるという事実が
正しく推論されたわけだが、何か?
それとも君には例の式は
(正しくは fn (id : 'a -> 'a) => (id 123 , id "abc") だが)
型エラーではないと思ってるのか?
367デフォルトの名無しさん:02/04/12 08:12
>>366
だから、それは型エラーが起きてあたりまえの例で、
本来型エラーが起きるべきではないのに、起きてしまう例をさがしてんだよ。
もしくはその逆。
ちゃんと話の流れを読めよ。
>>367
366のどこをどう読めば366が fn id => (id 123, id "abc")を
MLの型推論の欠陥だと主張していると思えるんだ?
話の流れをちゃんと読めてないのは367だろ。
369デフォルトの名無しさん:02/04/12 10:56
亀レススマソ。
> 俺は完全性を、
> あらゆる式について型付け可能である性質という意味で
> 使用していたが、
あらゆる式が型付け可能だったら、絶対に型エラーが出ないんだから、型検査の意味がないやんけ!
といってみるテスト。

ちなみに、どうしてもあらゆる式を型付けしたかったら、ユーザが意識してわざと
     Objective Caml version 3.04

 # type d = Fun of (d -> d) | Int of int | Bool of bool | String of string ;;
 type d = Fun of (d -> d) | Int of int | Bool of bool | String of string
 # let add (Int i) (Int j) = Int(i + j) ;;
 (中略)
 val add : d -> d -> d = <fun>
 # let apply (Fun f) x = f x ;;
 (中略)
 val apply : d -> d -> d = <fun>
みたく定義すれば、任意の形無しラムダ項をMLに埋め込めるよ。たとえば
 (λx. x x) (λx. x) 123
だったら
 # apply (apply (Fun(fun x -> apply x x)) (Fun(fun x -> x))) (Int 123) ;;
 - : d = Int 123
みたいに。だから、形無し言語で書けるプログラムなら、必ずMLでも書ける。
(Turing-completeなんだから当たり前だけど、「わりと自然に」ってことで)
もちろん、本当に実行して型エラーが出る式だったら、ちゃんと例外が出ちゃうけど。
 # apply (Int 3) (Int 7) ;;
 Exception: Match_failure ("", 10, 25).
とか。
370デフォルトの名無しさん:02/04/12 11:00
>>362
その議論だと
 # let id : 'a -> 'a = fun x -> x ;;
 val id : 'a -> 'a = <fun>
 # (id 123, id "abc") ;;
 - : int * string = 123, "abc"
も型エラーということになってしまうぞ。0ドラクマ?(w
結論は合ってるけど、理由が違う。
371デフォルトの名無しさん:02/04/12 11:03
>>365
MLではそんな例は存在しない、という結論で落ち着いたと思われ。
372355:02/04/12 11:14
言い方が悪かったかな。
 # let id : 'a -> 'a = fun x -> x ;;
 val id : 'a -> 'a = <fun>
 # (id 123, id "abc") ;;
 - : int * string = 123, "abc"
はエラーにならないのに、
 # (fun (id : 'a -> 'a ) -> (id 123, id "abc"))
  (fun x -> x) ;;
はエラーになる理由を述べよ、って言えば良かったのかも。
意味的には
 let x = 式1 in 式2

 (fun x -> 式2) 式1
は同じだけど、MLの型システムでは扱いが違う。で、「どう違うのか?」と。
>>370 >>372

(fn (id : 'a -> 'a) => (id 123, id "abc")
では上記全体で'aは同一だが
let id : 'a -> 'a = fn x => x in (id 123, id "abc") end;;
では、id 123 での 'a と id "abc" での 'a は別物。

これは別に奇妙な事でも何でもなくて、
letが局所定義のための表現式だということさえわかっていれば
fun id x:'a = x ;;
(id 123, id "abc")
がエラーにならないのと同様に
エラーとなるべきではないことぐらい簡単にわかるはず。
で、これのどこがMLの型推論の不完全さを示してるわけ?

あと、>>372
>意味的には
なんて言ってるけど、どういう意味で「意味的には」なわけ?
一方は局所変数の束縛、もう一方はラムダ束縛。全然違うじゃん。
374373:02/04/12 12:19
> let id : 'a -> 'a = fn x => x in (id 123, id "abc") end;;
じゃなくて
let val id : 'a -> 'a = fn x => x in (id 123, id "abc") end;;
ね。valが抜けてたわい。スマソ。
375デフォルトの名無しさん:02/04/12 12:31
普通完全っていうと論理でつかう完全性の
「正しいものは全て証明できる。」
で使う気がするけど、
ここで議論してた完全は
「プログラムに全て型付けできる」
だったのね。そんなわけないじゃん。
369がやってんのはdynamic typingでschemeとかperlで使われてる型システムだな。
実行時にマッチングするから、それが動的型チェックに対応して遅くなる。
376373:02/04/12 12:36
もうちっと別の言い方をすれば、
「idは仮パラメータだが、
id 123とid "abc"の両方を処理できるidの実パラメータが存在しないことが
型的に証明されている」
という言い方もできる。
377373:02/04/12 12:41
> ここで議論してた完全は
> 「プログラムに全て型付けできる」
> だったのね。そんなわけないじゃん。

え…
つまり (1 2 3)も正しく型付けしてほしかったとか
そんなヴァカな話だったのか…
違うよね? >>350
378372:02/04/12 13:01
>>373
> > 意味的には
> なんて言ってるけど、どういう意味で「意味的には」なわけ?
> 一方は局所変数の束縛、もう一方はラムダ束縛。全然違うじゃん。
操作的意味論だと文脈等価で、表示的意味論だとdenotationが同じになる、
という程度のつもりだったのだが、確かにそう考えれば直感的には違うな。
なるほど。
>>377
意味不明
380デフォルトの名無しさん:02/04/13 19:12
想像するに、350は本当に「あらゆる式」を型付け可能といいたかったわけじゃなくて、
「実際に評価してみて実行時型エラーを起こさない、あらゆる式」のつもりだったかと。
で、350もわかっているみたいだけど、それはTuring-completeな言語では決定不能で、
自動での推論は理論的に不可能。 if 複雑な条件 then () else (1 2) みたいな場合とか。
(MLよりも高度な型システムで、ものすごく複雑な型をプログラマが書けば別だけど…)

あと、fn (id : 'a -> 'a) => (id 123, id "abc") みたいな式を型付け可能な
型システムは存在する。もちろん、MLの型システムじゃ型エラーだけど。
System Fとかpolymorphic lambda-calculusとかで検索だ。

さらに複雑な型システムなら、構成的論理と同様の証明能力がある言語もある。
Calculus of Constructionsとか。もちろん、そういう型システムでは
自動的な型推論は不可能で、人間が証明を書かないといけないんだが、
証明の正しさはチェックしてくれる。
381355:02/04/13 20:08
>>376
>「idは仮パラメータだが、
>id 123とid "abc"の両方を処理できるidの実パラメータが存在しないことが
>型的に証明されている」

λx. x(SML風に書けばfn x => x、OCaml風に書けばfun x -> x)が存在するのだが…

ネタバラシをしてしまうと、MLの型システムで∀α. α → αと
ただのα → αは違う型なのに、多くの実装ではどっちも'a -> 'aみたく
同じに表示されてしまうのが混乱の元なんだよな。きっと。

別にMLの型システムが不完全だとは、俺は思ってないし言っていない。
「誰かが不完全だと思ってしまった例」を想像して挙げてみただけ。
ってもう誰が誰だか訳がわからんが。(笑)
382デフォルトの名無しさん:02/04/13 20:15
皆様のおかげで、どういう誤解がありがちか、非常によくわかりました。
試験問題の参考にさせていただきます。(藁
383デフォルトの名無しさん:02/04/13 20:17
MLに正規表現ってありますか?
384デフォルトの名無しさん:02/04/13 21:28
385デフォルトの名無しさん:02/04/13 22:05
やっぱり正規表現使うときはperl使います
386デフォルトの名無しさん:02/04/13 23:13
いや、
MLが単にmycroft/milnerシステムだと勘違いしていただけ。
Haskellに追随しているかなという推測で話をしていた。
387337:02/04/14 19:55
一つだけ言っておく、


























俺が厨房でした。ごめんなさい。
388デフォルトの名無しさん:02/04/14 23:06
関数型言語が工業的な場所で使われないのは何故か?

状態変化が記述しにくいから?
C(++,#)とかjava、もしくはperlくらい?が企業で使われていることを前提として
言ってますが。
389デフォルトの名無しさん:02/04/14 23:09
ML
ミリタリー言語
___
|×|siraneeyo.gif
 ̄ ̄
391デフォルトの名無しさん:02/04/14 23:13
>>388 工業的?
   FORTRAN,APL,HPFはどうよ?
392388:02/04/14 23:20
FORTRAN,APL,HPFを入れたければ別にいれてくれていいけど、
なんで関数型言語は学問の分野に留まってて一般的に実用的な分野で
使われないのかなと。
それとも僕が知らんだけで使われてるのかな?
emacs-lispくらいしかしらんが。
393デフォルトの名無しさん:02/04/14 23:31
関数型言語は、研究用プロトタイプ言語と思うけど。

C++, Java, C# には、関数型言語の研究成果がだんだん取り入れられているよね?

FORTRAN, APL, HPF を挙げたのは、
現在の関数型言語隆盛のきっかけを作った(?)
Jhon Backus の系統の言語で、しかも比較的メジャーだから。

394388:02/04/14 23:35
> 現在の関数型言語隆盛
どこが?研究機関を除けば手続き型の言語ばっかしだと思いますが。
javaのインターフェースは高階関数の実現として、
強引に見れば、関数型言語の成果と見られるかもしれないけど。
どういう見かたをするとそーなる?
396デフォルトの名無しさん:02/04/14 23:50
ごめん、話が通じると思ってた。私が悪かった。

関数型言語隆盛: 研究開発分野での隆盛
関数型言語の成果の実用化:
         Template と Generic Type、Generative Programming とか...
         スマン、今疲れてるから、「マルチパラダイムデザイン」とかで探してみて。
関数型言語隆盛: 関数型言語研究開発分野の隆盛
という罠
398388:02/04/15 00:04
罠にはまった。

>>396
どれもあんまり関数型言語とは関係ない気がするけどなぁ。
型システムは関数型とは直接関係しないでしょ。
マルチパラダイムデザインのどこが関数型言語と関係してるんだろう。
オブジェクト指向はむしろ関数型に採り入れづらい概念だと思うけどなぁ。

>>395
Javaのインターフェースは静的にかつユーザーが型を
指定する言語で高階関数を実現する手段だと思ってたけど間違い?
399もしかして、実用分野との繋がりを持たない関数型言語研究?:02/04/15 00:23
今日の所は、こんなもんで手を打ってくれい
>>396
○関数型言語を使った研究の研究成果(型システム方面〜他にいろいろ...)の実用化
×関数型言語の成果の実用化
>>388
良い言語が現場で使われるとは限らない。
COBOL や VB なんかがいっぱい使われていたりする。
そういうもん。
401388:02/04/15 00:26
もしかして関数型言語の意味が違う?
まさかCとかFortranが関数型言語とは思ってないよねぇ?
>>396 >>399
402どうも話が通じない...?:02/04/15 00:28
>>401 (こと388)
もしかして、言語FPとか知らない?
403388:02/04/15 00:29
>>400
そりゃわかってるけど、
別に 良い言語 = 関数型
とは言ってなくてなんで 現場では関数型言語は使われないかと。
FORTRAN は…
405388:02/04/15 00:30
>>402 (多分今まで話して来た人)
しらないっす。
僕は関数型言語というとラムダ計算に基づくようなやつを思い浮かべるが
それではないと?
406デフォルトの名無しさん:02/04/15 00:36
>>405
計算モデルとしてはラムダ計算は有名だ
407400:02/04/15 00:39
>>403
なんで関数型言語が現場で使われないことを疑問に思うのだ?
別に良い言語だとは思わないのだろ?

とまあ、それはともかく
使われない理由は>>152-200あたりに書かれている理由ぐらいかと。
>>405-406 のやりとりが何故か笑えた
409388:02/04/15 00:46
>>403
関数型言語はコンパイル時の最適化も命令型よりもかけやすいし、
良い言語だと思っているけどなぁ。

やっぱ、計算機に基づいてできた言語じゃなくて数学に基づいできた言語
ってのが現場で使われない原因ってことなのかな。
410403(がんばって書いたけど読みにくくてスマソ):02/04/15 01:25
FP言語は、プログラム代数に基づく関数言語。
・ラムダ計算をCartesian Closed Monad の形に書き直す事で、
 FPと似た形式が得られる。
・代数規則によるプログラム変形をやり易い(ラムダ計算より単純)。
・データを一まとまりの構造型データとして扱う事で、
 「フォンノイマン・ボトルネック」を解消できると主張.

ってな感じです。

んで、FORTRANとHPFをあえて「関数型言語」にねじ込もうとした理由は、
FP言語を「関数言語」と呼ぶならば、
そのきっかけとなったであろうFORTRAN (プロセス中心言語)や、
あるいは APL〜FP の延長線上にある並列数値計算言語 HPF ってあたりにも、
実は同じ血が流れているのではないか、と思いました。

明示的にラムダ計算を扱ってなくても、
ラムダ計算モデル(あるいはそれと等価な計算モデル)
により適切なモデリングが可能なプログラム言語を、
関数言語の仲間に入れちゃマズイっすか?

411410:02/04/15 01:28
なんか、語尾が変で鬱
○ 実は同じ血が流れているのではないか、と思ったからです。
× 実は同じ血が流れているのではないか、と思いました。
412388:02/04/15 01:57
Cartesian Closed Monadをgoogleで探すと0件なんですけど、どっか綴間違い?
FP言語がどうしても見つからない。
さっき見つかった気がするんだけど、その記憶の限りでは
関数呼び出しのcall-by-valueを統べて代入に置き換えてただけのような。
そうすると計算の仕方は同じになるけど、関数型言語の全ての部分式が
値を持つっていう性質は失われるし、関数型言語をコンパイルするときには
おなじことを行うわけだから、何にも新しいことを言ってないような。

あとなぜFP言語のきっかけとなっただけで、フォートランを関数型と
言えるのかがかなり疑問。FORTRANが関数型なんて解釈は聞いたことない。
schemeとかMLですらラムダ計算でモデリングできないのになぜフォートランで
できるやら。
denotational semanticsを使えば、MLでも schemeでも Cでも
モデル化できるのでは?
414388:02/04/15 02:29
>>413
それはラムダ計算と直接関係してないのでは?
ただの意味づけの仕方じゃないの?
>>398
JavaのインターフェイスやC++の抽象クラスや、
もっと言うと、SmalltalkのImprementedBySubclassが、
どういうふうに高階関数と関係するのか、
もうちょっと聞きたいと思うのだが。
416388:02/04/15 02:52
>>415
スモールトークはよく知らないけれど、
例えば、java.util.Collectionsにあるメソッド
public static void sort(List list,Comparator c)
はML風に型を書くと
'a list -> (('a * 'a) -> boolean) -> 'a list
と型つけできて、javaでこれを実現するためのインターフェースなのでは?
と言う感じ。
抽象クラスは関係ない。
417410:02/04/15 03:01
>>412
○ Monoid
× Monad
何を書いているやら>>自分

FPは、ACMのTuring賞ページあたりから辿れると思います。

>FP言語のきっかけとなっただけで、フォートランを関数型と
>言えるのかがかなり疑問
写像って意味の関数。
418388:02/04/15 03:03
>>417
それは「関数型プログラミング言語ML」の関数型と意味が違うんじゃないの?
419410:02/04/15 03:14
違うでしょうかね?
高橋正子センセの本でも扱ってる、普通の意味だと思うけど。
>>416
>抽象クラスは関係ない。
だとすると、それはJavaのインターフェイスの話では無くて、ポリモルフィズムの話だと思う。
421410:02/04/15 03:19
うーん、関数型言語の範囲を広げる事で(仮に関数言語と呼ぶ)、
    研究プロトタイプとしての関数型言語と、
    その実用例としての関数言語に分けて、
    関数型言語の意義を議論するつもりだったんだけど。
どうしても、MLとか型付ラムダ計算って範囲に限定したいのですか?
>>421
副作用のある手続きと、写像である関数(函数?)との区別の無い言語を、
関数型言語の範疇で議論するってこと?
423388:02/04/15 03:33
>>420
javaのインターフェースはポリモーフィズムを実現するものじゃないの?
ポリモーフィズムは高階関数と密接に関係してると思いますが。

410のいってる関数言語は一般に関数型言語と呼ばれるものではない気がします。
フォートランを関数型言語っていう人はいないと思うし。
関数型言語は研究のプロトタイプではなくて、それ自体で実用性を
求めてるし。
関数型を全て代入式に置き変えたら関数型の意味がない。
あと一般にいう関数型言語に型付きは関係ないです。
フォートランを関数型言語とみなした場合に関数型言語でない命令型
言語は何が残るの?
424420:02/04/15 04:01
>>423
>javaのインターフェースはポリモーフィズムを実現するものじゃないの?
逆です。
ポリモルフィズムは、主に継承によるものです。

Javaのインターフェイスは、サブクラスにメソッドの実装を
強制するものです。
あるインターフェイスを継承したクラスのインスタンスは、
特定のメソッド(sortの場合は比較)をもっているしている
ことが保証されているから、静的な型チェックを通るよ、
っていう事です。
高階関数(というか、関数を渡すという意味)とは違うと思います。

どーでしょう?
425デフォルトの名無しさん:02/04/15 04:13
>>412
>FP言語がどうしても見つからない。
>さっき見つかった気がするんだけど、その記憶の限りでは
>関数呼び出しのcall-by-valueを統べて代入に置き換えてただけのような。
>そうすると計算の仕方は同じになるけど、関数型言語の全ての部分式が
>値を持つっていう性質は失われるし、関数型言語をコンパイルするときには
>おなじことを行うわけだから、何にも新しいことを言ってないような。

何か、違うものを見ておられるようですね。
御参考: http://www.yfcbookshelf.com/ml_lisp_scheme.htm
    http://ca.meme.hokudai.ac.jp/people/tak/fp/fp-eval.html
426388:02/04/15 04:20
>>424
それはstructural polymorphism(構造的多相性)ってやつで、
一種のポリモーフィズムですね。
MLスレッドだから、暗黙にMLを前提としてしまっていて、
MLにあるポリモーフィズムはパラメトリックポリモーフィズムというやつで
(MLには部分型がないので)sortなんかがその例です。
sortには関数を渡したいんだけど、Javaではメソッドを値として
扱えないから、interface使ってその代用をするんでしょ。
メソッドがあることの保証は意味論とは別の観点っす。
そう説明してある本も多いけど。
427410=425:02/04/15 04:26
あ、FPってコンビネータ論理です。
 関連スレ:http://mentai.2ch.net/test/read.cgi/infosys/1017686362/l50

>>423
>あと一般にいう関数型言語に型付きは関係ないです。
>フォートランを関数型言語とみなした場合に関数型言語でない命令型
>言語は何が残るの?

関数型言語の理論だけならともかく、
関数型言語自体を、小さな枠に収めて盆栽みたいに育てた場合、
どんなメリットがあるとお考えですか?
428388:02/04/15 04:27
>>425
1977年か。僕の生まれる前だ。
たしかにこのFPは関数型だと思うけど、フォートランが関数型だと呼ぶ
には至らないです。
429デフォルトの名無しさん:02/04/15 04:30
うーむ、教科書どおりの回答しか得られないのであれば、
議論は不要みたいですね。残念

430388:02/04/15 04:30
>>427
そんなもんschemeとかMLの仕様書を見てみりゃわかるし、
linear typeとか最近の型理論が関数型を前提としてるものが多い
ことを考えればわかるでしょう?
431424:02/04/15 04:34
>>426
>interface使ってその代用をするんでしょ。
はい、もちろん「代用」です。

つまり、Javaのインターフェイスを関数型言語の立場からみると、
そういうふうに見えるって事ですね?

だとすると、
>>394
>javaのインターフェースは高階関数の実現として、
>強引に見れば、関数型言語の成果と見られるかもしれないけど。
「関数型言語の成果」は、誤解を招く表現だったかもですね。
432デフォルトの名無しさん:02/04/15 04:35
ふーん、関数型を前提としない型理論って聞いたことなかったです
それはただの勉強不足です。
434デフォルトの名無しさん:02/04/15 04:37
>>432>>430へのレスね。
 
435名無しさん:02/04/15 04:39
>>410
> 明示的にラムダ計算を扱ってなくても、
> ラムダ計算モデル(あるいはそれと等価な計算モデル)
> により適切なモデリングが可能なプログラム言語を、
> 関数言語の仲間に入れちゃマズイっすか?

(型なし)λ計算でいまあるほとんどの言語はモデリングできてしまいます。だ
からモデルできることが関数型である、というのはあまり意味をなしません。
MLでsmalltalkのインタプリタを書いて、「smalltalkはMLライクな言語であ
る」とはいえないでしょ?

言語が**型言語である、というのはその言語がプログラムとその実行をどのよ
うにとらえるかによって決まると思う。んで、そのとらえ方が人によっまちま
ちで、厳密だったり、そうじゃなかったりもするから、いろんな言語が存在す
るわけで。

関数型言語のおおまかなスローガンは

プログラム=関数、プログラムの実行=関数の値の計算

じゃないすかね。んで副作用が入るか入らないかでもめる、と (W
あと関数が言語中で他のデータと同様に扱えるというのも一つの基準だと思います。
436デフォルトの名無しさん:02/04/15 04:39
いゃマジ、プログラミング言語の文脈で、
関数型を前提としない型理論ってあるんでしょうか?
OOPLでは、「あるメッセージにどう反応するのか」まで含めて、「型」という捉え方しますね。
438410:02/04/15 04:46
>>435
FPは、関数とデータを分離して考える、由緒正しい純関数型言語らしいです
439388:02/04/15 04:49
>>435
ラムダ計算は状態の記述ができないから、schemeのset!とかMLの参照へ
の代入みたいのはモデリングできなくて、命令型なんてほとんど状態
変化だから、ほとんどの言語はλ計算モデリングできない。のでは?
関数型の枠組だとどうか知らないけど、λには副作用はないと思う。

>>436
javaのクラス継承も部分型の理論だから、関数型にとらわれない
型理論は多くあると思います。あとflow-analysisも型でやっちゃうのも
あるから、そういうのは逆に命令型に特有なのかも。
440388:02/04/15 04:50
>>410
>>関数とデータを分離して考える、由緒正しい純関数型言語
関数をfirst-orderとして扱うlambda計算は純関数型言語じゃないってこと?
441デフォルトの名無しさん:02/04/15 04:54
夜中なのに活発だ...

>>427
小さな枠で厳密な議論をすれば、深いことが言えそうです。
あれもこれも追加したら体系が複雑になって、見えるものも見えなくなってしまう。

>>436
型理論をどういう意味で言っているのかちとよくわからんが、オブジェクト
指向言語やプロセス代数に対する型システムを考えると関数型が出てくる
とは考えにくいのでわ(もちろん関数型というものを定義できるかもしれんが)。
442388:02/04/15 05:02
っていうかlambda計算は関数以外の値は存在しないんだった。
関数とデータを分離して扱うなんてどう考えても無理だ。
でもlambda計算が関数型言語じゃないなんて聞いたことないな。
443410:02/04/15 05:03
>>440 いや、関数とデータを同一に扱う流儀(ラムダ計算)と
              別に扱う流儀(FP)
   があるってだけです。


444410:02/04/15 05:06
あ、ここ(>>430)でいう型理論って、型に関する理論全般って事ですか。
了解。
445デフォルトの名無しさん:02/04/15 05:16
>>439
> ラムダ計算は状態の記述ができないから、schemeのset!とかMLの参照へ
> の代入みたいのはモデリングできなくて、命令型なんてほとんど状態
> 変化だから、ほとんどの言語はλ計算モデリングできない。のでは?
> 関数型の枠組だとどうか知らないけど、λには副作用はないと思う。

例えばCPUのエミュレータを作ることを考えるとします。ひとつひとつの命令
の副作用は、命令の実行前のレジスタ、メモリの状態から実行後の状態への関
数としてみることができます。だから、プログラムの実行はそれらをfoldした
ものになります。というぐあいにしてやればλ計算の中でCPUエミュレータが
作れます。

要は副作用の作用が関数的なら、副作用そのものを関数の操作の対象におしこ
めて、一つのおっきな関数をつくってしまえ、ってこと。
446388:02/04/15 05:21
>>445
なるほど。状態を全て引数として持って行けばいいってことですね。
かなり納得しました。
エミュレータは閉じた系だから、>>429の言う「状態の変化」とは違う気がするんだが…
448447:02/04/15 05:25
>>439の言う、でした。
449388:02/04/15 05:27
>>447
開いた系の場合に問題があるってこと?
どんな場合っすか?
450435:02/04/15 05:30
>>438
> FPは、関数とデータを分離して考える、由緒正しい純関数型言語らしいです

ガーソ、そうだったんですか...勉強ぶそくでした。

> あと関数が言語中で他のデータと同様に扱えるというのも一つの基準だと思います。

一方Cでは関数へのポインタがあるにもかかわらず関数型とはいえない...
まあスローガンからして違うのでいいのですが。

Cの関数へのポインタとMLの高階関数の違いをすぱっと言い切るには
どうすればいいんでしょうか? 人に説明するとき悩んでます。
451388:02/04/15 05:40
>Cの関数へのポインタとMLの高階関数の違いをすぱっと言い切るには
>どうすればいいんでしょうか? 人に説明するとき悩んでます。
僕は同じと言い切ってしまいたい。
型とかそういうのを置いておけば、実装はあまり変わらないははず。
452447:02/04/15 05:45
>>449
たとえば、CPUのエミュレータの場合、I/Oポートからの入力命令があれば、>>445のモデルは破錠するでしょ。
453デフォルトの名無しさん:02/04/15 05:47
計算機にプリンタがつながっていて、言語から印字ができる、ってな場合
λ計算にもプリンタをつながなければ...ということか? >開いた系
454デフォルトの名無しさん:02/04/15 05:48
>>450
関数型かそうじゃないかは
「副作用のあるものと、無いものを文法レベルで区別できるかどうか」
でわけるっていうふうに説明してるよ。
>>453
予測不能な外部からの入力は、λ計算でモデリングできないでしょ。
456445:02/04/15 05:52
>>452
> たとえば、CPUのエミュレータの場合、I/Oポートからの入力命令があれば、>>445のモデルは破錠するでしょ。

その場合はI/Oの入力時系列も引数にいれればいいんじゃない?
要は次の状態を決めるものはなんであれ引数におしこんでしまう、と。
>>447
そもそもチューリングマシンでモデリング可能なものは
λ計算でもモデリング可能なはずですが。理論上は。
458388:02/04/15 05:56
I/Oポートから来る情報も01なんだから、予測不能の入力はないと思うけど。
459452:02/04/15 05:58
>>456
I/Oの入力の時系列データが存在するなら、それは閉じた系でしょう。
I/Oポートの先に計測器や人間の操作が繋がっててる場合を考えれば。

あともうひとつ、自分自身の実行時のコンテキストは、全て引数にする事は不可能、ってのも。

そろそろ寝るです。
>>459
そういう引数は遅延評価で必要な時に生成してやればいい。
461459:02/04/15 06:07
>>460
遅延評価は、いつ評価しても、同じ所を評価したら同じ結果になるから出来るんで、
評価する時間によって値が違うのは、遅延評価ではないでしょ?
462445:02/04/15 06:18
>>455
> 予測不能な外部からの入力は、λ計算でモデリングできないでしょ。

入力データをプログラムで表すことは問題にしてません。エミュレータだって
そういう部分は結局外側の環境に全部丸投げしてますし。

問題はある言語で記述されたプログラムの入出力の関係をλ式で表せるか、と
いうことです。んで、λ計算には状態とか状態の更新という概念がないから無
理じゃないの、というのに対する答えが、状態の更新は状態から状態への関数
とみなせるから、λ計算の中でそれらの概念をモデル化できる、というもので
す。

とはいうものの、エミュレータと言ってますが、457の意味ぐらいで使ってた
ので、現実のIOに関するツッコミは予想外だった...
463459:02/04/15 06:27
どこまでを予測不能とするかは、言語によっていろんな立場があるかもしれないけど、
そういう予測不能なモノを扱うか、扱わないかが、1つの界面なんじゃないでしょうか?

扱わないっていう選択肢もあると思います。
扱うとしても、それは本来のその言語のモデルを超えた、「実用化」のための
妥協とする選択肢もあるかと。

どちらにしても、そういうものを、明示的に区別するのが関数型言語の特徴のような気がしますが、どーでしょう?
464435:02/04/15 06:30
>>451
> 僕は同じと言い切ってしまいたい。
> 型とかそういうのを置いておけば、実装はあまり変わらないははず。

ように思えて実は並々ならぬ苦労が注がれているので、
やはり違うのでは...
>>462
外に取り出して持ち歩いたり、外から書きなおしたり出来るなら、
それは「状態と副作用」の文脈で言う状態とは違うでしょうね。
っていう事言おうとして、へんな方向いっちゃたけど、

ま、これは「状態」について、ある言語がどう定義してるか、
の問題かもしれないですけどね。

466デフォルトの名無しさん:02/04/15 07:26
 Java の interface と高階関数の関係が分からないのですが、

 >>426 の以下の部分はどういう事でしょうか?
  > sortには関数を渡したいんだけど、Javaではメソッドを値として
  > 扱えないから、interface使ってその代用をするんでしょ。

 高階関数というのは、関数の引数に関数を取れたりする事ですよね?
467388:02/04/15 12:06
>>466
static void sort(List list, Comparator c)
の型をML風に書くと 'a list -> ('a * 'a -> boolean) -> 'a list
に対応していて、インタフェース Comparatorが
'a * 'a -> booleanに対応しているという意味です。
細かいこといえば 'a * 'a -> int なんだけれども。
>>466
>>388の妄想です、わすれてください。
469デフォルトの名無しさん:02/04/15 14:01
ファーストクラスの関数と内部クラスが似ているという話ならば既知だが・・・
高階関数とインターフェースの話は・・・
ここはMLスレだから、OOPLの事は知らなくてもいいんだよ。
犬しか知らない幼児が、4本足が全部犬だと思うのと一緒さ。
471デフォルトの名無しさん:02/04/15 14:39
>>ファーストクラスの関数と内部クラスが似ている
内部関数とインナクラスが似てるだけで、
ファーストクラスの関数は関係ない。
472デフォルトの名無しさん:02/04/15 14:42
>>470
MLだからOOしらなくていいってことはない。OcamlのOでしょ。
全部犬だと思ってはダメ。
473デフォルトの名無しさん:02/04/15 15:23
>>471
いや、俺はWadlerが書いたことを真に受けたんだが。
474デフォルトの名無しさん:02/04/15 22:12
>>471
>内部関数とインナクラスが似てるだけで、
構造的には、まったく違うぞ!!!
なんて判りきったことをつっこんでみたりしてー。

使う所は似てるけどねー。
>>470 そーだね。
>>461
無限ストリームを使ったキー入力の実装みたいのを想定してました。
age
478デフォルトの名無しさん:02/04/17 12:29
http://caml.inria.fr/archives/200204/msg00124.html
> Subject: [Caml-list] call for English-to-Japanese translators of the O'Reilly OCaml book
翻訳者募集らしい。
http://caml.inria.fr/oreilly-book/html/index.html
これの製本は売ってないの?
誰かやれ
481デフォルトの名無しさん:02/04/17 22:43
ズバリ、みなさんがMLに惚れ込んでいる理由は何ですか?
べつに、惚れてないです。
型推論がある(らくちん)
datatypeがある(enum+union+structと同じことをずっと簡単にできる)
メモリの自動管理(Cには戻れん)
関数のclosureをとれる(event handlerが書きやすい)
パラメトリックポリモルフィズム(コードの使いまわしが可能)
型付きである+型システムの健全性(バグの起きる理由が減る)

STL? もう見てらんない。

....とやや煽り調で言ってみるテスト。
関数プログラミング言語の入門用として良く挙げられているものに、
MLとかSchemeとかあるが、
これは本当か?
いまいち納得できないんだが。
Schemeは入門用として納得。理解してなくてもだいたいで使えるし。
MLは理解しないと使えないからどうかなと。
486デフォルトの名無しさん:02/04/18 16:20
どちらも理解しないと使えない。大して理解しなくても使える。どれも正しいような
>484
お前はHaskellやって納得しろ。
488デフォルトの名無しさん:02/04/19 00:07
さっきからOcamlの勉強を始めた、MLは初めての初心者です。
www.ocaml.orgの"O'caml Intro"とかいうチュートリアルを
読んでるのですが、早速ドロップアウトしそうなので助けて
ください。
次のような関数の定義なんですが、これの型がどうして下段
のようになるのかわからんです。

#let deriv f dx = function x -> (f(x +. dx) -. f(x)) /. dx;;
val deriv : (float -> float) -> float -> float -> float = <fun>

私的には、こいつの型は、
((float -> float), float) -> (float -> float)
だと思います("(A, B)"はAとBの直積)。それから、
float -> float -> float ってどう解釈するんですか?
float->float->float は float->(float->float) のこと。
つまり float を受け取って、float->float 型の関数を
返す。
どんな関数でも引数は一つ、って思ってくれ。
# let deriv = function f -> function dx -> function x -> (f(x +. dx) -. f(x)) /. dx;;
val deriv : (float -> float) -> float -> float -> float = <fun>
って書いても一緒さ。
>>489
まだ理解できませんが、とりあえず説明どうもです(w
488の定義だとderivはfとdxを引数に取ることが明示されてる
わけですが、489の定義だとそうではないですよね?ということは、

deriv f;;とやったらfloat -> float -> floatが戻り、
deriv f dx;;とやったらfloat -> floatが戻り、
deriv f dx x;;とやったらfloatが戻る

ということでしょうか?
>>490
「カリー化」で調べてみな。
>>491
どうもです。勉強してみます。

# 「カリー化」で出てきた南山大学のチュートリアルは分かり易そう。
# とりあえずこっちに切り替えてSMLやってみる。
>>490
そうです。あとは
deriv f dx x は ((deriv f) dx) x 
の事だと言う事がわかればつじつまが合うのではないでしょうか。

引数が明示されている・いないというよりも、関数型の値を作るには
基本的にλ抽象(?) (function x -> 中身) しかなくて、

let f x y = 中身 は let f = function x -> (function y -> 中身)

の省略形だと言うことかな。OCaml ではさらに fun ってのもあって、
例えば

fun x y -> 中身 が function x -> (function y -> 中身)

の省略。どういう形で書こうが意味的にはどれも一緒のはず。
(漏れも厨房なので間違ってたらスマソ)
>>493
なるほど。引数と関数の型の関係について、何となく(w
解った感じがします。後はfunction, let, funといった
字句の意味を抑えてみるっす。
どうもでした。
495食いしん坊万世:02/04/19 19:50
ハスケル・カリーって美味しいの?
496デフォルトの名無しさん:02/04/19 21:33
プログラムの正しさの証明については、みなさんどう思いますか?
MLのような、型のしっかりした言語でもミスは起こり得るわけで、
ましてや、C++のような言語を使って、金や命にかかわるようなプログラム
書いててだいじょうぶかぁって。オレはアマチュアだからいいけど、プロは
責任重いよな〜。

>>495
http://www.haskell.org/bio.html
あまり美味しそうには見えないよ。
>497
右目と左目とで、表情が違うね。
>>496
静的に完全にチェックできるわけはないけど、
静的にできる部分が多ければ多い程 プログラマの負担がへると思います。
新しい言語はそういうのを意識してるのが多いし、やっぱ重要っすね。
500!
折り返し地点
501デフォルトの名無しさん:02/04/20 14:43
MLってSchemeにくらべて利点ってなに?
動的型宣言があるからデバッグがやりやすいとか?
502デフォルトの名無しさん:02/04/20 15:14
動的型宣言?
明示的型宣言ではなくて?
>>501 >>502
? 静的型(宣言)のことか? そうさせてもらうぞ (W

ちと長いし、言ってることはほぼ既出だが...

MLは型付きなので、ユーザは型システムが要請する規則に従ってプログラムを書
かなければならない。だから、慣れないうちはなんだかよく分からない規則のせ
いで思ったようにプログラムが書けない、と窮屈に感じるかもしれん。それに対
してschemeには静的型の概念が無い分、言語の設計が簡潔なのでとっつきやすい。

しかし、MLでは型チェックを通ったプログラムは実行しても型エラー(例えば
Emacs lispでいうところの Wrong type argument: ...)を起こさない。MLの型シ
ステムはこれを満たすように設計されており、またこれからもそうであろう。

これをうれしいと見るか、それとも取るにたらない、と見るか。

そんなエラーはテストで取り除けるからいい、とか手で変数名に型をつけるから
いい、とかいうのであればMLは魅力的に見えないかもしれない。この辺の議論は
「型なし言語逝ってよし」スレにも議論があったと思う。

俺はプログラムが大きくなると(俺的には小さくてもだが)この手の小さなミス
が混入する可能性を排除しきれないと考える。だから、MLの型システムがこれ
を防いでくれるのは、一つのメリットだと思う。
>>496

みずぽの件を見てもそう思う。

自分の書いてるプログラムが原因不明のエラーを出す時なんか、デバッガ使う
よりも証明(というよりは反例探しだが)したくなるが、そもそもソケット通信
+マルチスレッドのプログラムをどう検証すればいいのかさっぱりわからん...
どんな計算系使えばいいの? どんな論理学使えばいいの?
>>504
どんな性質を証明したいかによると思われ。
例えばTCPソケットの状態遷移に関しての到達可能性などならCTLを使えるし、
マルチスレッドでのデッドロックを検証したければpetri-netとreachability graphだろうし。
506デフォルトの名無しさん:02/04/20 17:26
>>503
静的型宣言?
静的型付きではなくて?
507デフォルトの名無しさん:02/04/20 18:44
>>505
> どんな性質を証明したいかによると思われ。

「うまく動かない」ということをなんとかして確認したいのですが...(^^;
具体的には想定外の入力が起きる条件を確定したいのです。
ほぼ動いているようにみえるのですがたまに通信で想定外の入力がきて
不具合がおきてしまう。でもなかなか状況を再現できないから、
いっそのこと全部形式的に書き下して条件を見つけてしまえればなぁ、と。
動機が不純ですかね (W

> 例えばTCPソケットの状態遷移に関しての到達可能性などならCTLを使えるし、

なるへそ、これはこれでおもしろそうです。TCPにCTLが使えるというのは何か
参考になる論文とかありますでしょうか?

> マルチスレッドでのデッドロックを検証したければpetri-netと
> reachability graphだろうし。

マルチスレッドのモデルってペトリネットが定番なんでしょうか?
普通のプロセス計算ではちょっと合わないと思ったので。

reachability graphとわ何でしょうか?

くれくれ君でスマソ。
>>507
Boris Beizer 「ソフトウェアテスト技法」 の一読を薦める
509505じゃないけど:02/04/21 00:34
>>507
Automatic Verification of Transmission Control Protocol Using NuSMV
っていうのがあった。
ttp://www.cs.toronto.edu/~chechik/courses99/csc2108/projects/index.html

あと、検証の話があるか知らないけど、UDPの動作を
モデル化しました、みたいな論文がどっかにあった気がする。
510507:02/04/21 10:54
>>509

ありがとうございます。NuSMVというモデルチェッカ内でTCPの状態遷移を表現
して、ちゃんと状態遷移しますよー、とかどんなアタックがありうるか、ある
場合どんなもんか、というのを調べる話しのようです。NuSMVのホームページ
に行ったら他の例もあったので、もうちょっと検討してみます。

っと、だんだんMLからはずれてきたので何かネタをふらねば...
511デフォルトの名無しさん:02/04/21 17:21
俺、自分の仕事はRDBMSにアクセスするプログラムを書くことなんだけど、
MLでRDBMSにアクセスするにはどうしたらいいかな?
512デフォルトの名無しさん:02/04/21 18:08
RDBMSについては何も知らないのですが,O'Camlの場合,以下があるよ
うです.
http://www.eleves.ens.fr:8080/home/frisch/soft#postgres
513デフォルトの名無しさん:02/04/21 19:52
お。よさそうだ。さんきゅー。
>>501-503,>>506
なんとなく藁藁
515デフォルトの名無しさん:02/04/25 16:59
>>451
>>Cの関数へのポインタとMLの高階関数の違いをすぱっと言い切るには
>>どうすればいいんでしょうか? 人に説明するとき悩んでます。
>僕は同じと言い切ってしまいたい。
>型とかそういうのを置いておけば、実装はあまり変わらないははず。
亀レススマソ。MLではfun f x = fn y -> x + yみたく、
「実行時に関数を作って返す」ことができる(ように見える)のに対して、
(普通の)Cではできない。そのために、MLやSchemeのような関数型言語では
「関数クロージャ」というデータ構造を導入して、実際には実行時コード生成なんか
せずに高階関数を実装する手法が主流。なので、別に型がなくても、実装はやや高度になる。
516デフォルトの名無しさん:02/04/25 17:01
π-calculusって計算体系があるヨ>マルチスレッド
petri-netとかよりは普通の並列プログラムに近い。
517デフォルトの名無しさん:02/04/25 17:03
π-calculusって計算体系があるヨ>マルチスレッド
petri-netとかよりは普通の並列プログラムに近い。
518517:02/04/25 17:04
うぎゃ。二重カキコすまそ。
519デフォルトの名無しさん:02/04/25 17:58
>>516
> π-calculusって計算体系があるヨ>マルチスレッド
> petri-netとかよりは普通の並列プログラムに近い。

そうかな? piのプロセス間通信に相当するプリミティブは
スレッドにはないし、逆にスレッドの生成はpiですぐに書ける?
# やろうと思えばできんことはないと思うが

piはスレッドよりは通信しあうプログラム間のモデリングに向いていると思う。
マルチスレッドは排他制御しながらグローバルな状態をスレッドが共有してい
る感じ。境界がpiほどはっきりしてない、というか。
520517:02/04/25 19:02
スレッドの生成は並行実行自身だから当然として、メモリもチャネルで簡単にエンコードできるからいいんじゃん?
もちろん、第一義的にはπ計算は共有メモリじゃなくてメッセージパッシングの計算体系だけど、
>>504は「ソケット通信+マルチスレッド」っていってるから両方とも必要なわけで、
共有メモリも表せるならOKかと。「マルチスレッド」だけ取り出した言い方が悪かったかな。
あと、「ペトリネットよりは近い」だけで「同じ」とまではいわない。
π計算に基づく言語プロセッサはありますか?
>>515
クロージャの分の引数が1個増えるだけってことでしょ。
そんならあまりかわらんかとおもったんだが。
でもコンてィニュエーションももらうと結構違うか。む。
asage
524デフォルトの名無しさん:02/04/26 01:03
>>515 は処理系の実装
>>522 はユーザプログラム
の話をしているから話がかみあってないように見える
525デフォルトの名無しさん:02/04/26 01:04
>>521
> π計算に基づく言語プロセッサはありますか?

PICTというのがあるらしい。最近はNomadic PICTか?

http://lsewww.epfl.ch/~pawel/nomadicpict.html

526522:02/04/26 02:04
>>524
処理系の実装の話をしたつもりだったのに。
クロージャもコンティニュエーションもユーザが
渡すわけないじゃないか。
527524:02/04/26 03:03
>>526
ああ、誤解だったのね。すまそ。

でも、
> クロージャもコンティニュエーションもユーザが
> 渡すわけないじゃないか。
クロージャもコンティニュエーションも1st class objectとして扱かえるのはすごく強力な武器だし、
実際ユーザプログラムの関数がクロージャやコンティニュエーションを渡し渡されすることは
そんなに珍しいことではないと思われ。
528522:02/04/26 03:21
>>524
どんな言語で?
529522:02/04/26 03:46
コンティニュエーションはcall/ccか。ありました。
530515:02/04/29 11:11
>>522
> クロージャの分の引数が1個増えるだけってことでしょ。
> そんならあまりかわらんかとおもったんだが。

「あまり変わらん」かどうかはちょっと主観的だからさておき、「引数が1個増えるだけ」よりは
もうちょっとややこしい。関数の表現がコードへのポインタだけじゃなくて、「コードへのポインタと
自由変数たちの値の組」(要するにクロージャ)になるから、一般に関数を作るところ
(fn x => ...とか)ではメモリ確保が必要だし、呼び出すところでは1段のindirectionが入る
+「引数が増える」。あと、一般にクロージャのためにmallocメモリを解放するためには
ガベコレが必要になる。解析すればallocaみたくスタックに確保できる場合もあるけど。

で、自由変数を持たない関数までそんなことをやってるととオーバーヘッドがかかるので、
自由変数を持つ関数がどの式に来てどの式に来ないか、これもコンパイラが解析したりする。
あと、自由変数を持たない関数でも、静的にアドレスがわかってれば間接ジャンプじゃなくて
直接ジャンプするとか。

長文スマン。
531デフォルトの名無しさん:02/04/29 11:15
532515:02/04/29 11:17
きゃーtypoだらけ。

> クロージャのためにmallocメモリを解放する
「mallocメモリ」→「mallocしたメモリ」

> そんなことをやってるとと
「とと」→「と」

とととととととととと。
533デフォルトの名無しさん:02/04/29 11:22
それよりも俺が知りたいのはocamlのオブジェクトの実装方式なんだが。ML Workshopの
Remyの論文が超絶的に理解不能なんだが、他に何か読むと良いものはないか、お前ら
もしご存知でしたら教えていただけないでしょうか?(ソースコードや
コンパイルして出てくるアセンブリはもう見た)
534デフォルトの名無しさん:02/05/01 15:26
MLの話をしようよ
fun loop [] = loop [recv insCh]
| loop buf = if (length buf > maxLen)
then (sen (remCh, hd buf); loop (tl buf))
else (select remCh!(hd buf) => loop (tl buf)
or insCh?x=>loop (buf @ [x])
age
536デフォルトの名無しさん:02/05/03 01:40
MLでXMLのパーサなど良いツール類をごそんじの方はおられませんでしょうか。
あと日本語処理関係とか。
今のところEUCにして誤魔化してるんだけど。
ML.NET
538デフォルトの名無しさん:02/05/03 10:49
http://sourceforge.net/projects/camomile
あたりはどうよ。俺は使ったことないけど…>日本語処理

XMLは「xml ocaml」とか「xml "standard ml"」とかで
googleすればいくつか出てくる。
539デフォルトの名無しさん:02/05/03 16:17
MLにできてHaskellにできないことって何ですか?
540デフォルトの名無しさん:02/05/03 19:33
>>539
Functor
541デフォルトの名無しさん:02/05/03 20:18
末尾再帰の最適化
542デフォルトの名無しさん:02/05/04 23:18
>>540
似たことはできるよね。

>>541
冗談でしょ?
冗談です
544デフォルトの名無しさん:02/05/05 00:50
MLは言語仕様として末尾再帰の最適化を行います。
ですので必ず行われます。

Haskellは遅延評価の性質と合わないために、
末尾再帰の最適化が自動的に行われる事はありません。
コードに細工して、なおかつコンパイラやインタプリタがそれを
拾ってくれた場合にのみ行われます。
545デフォルトの名無しさん:02/05/05 01:46
遅延評価っつっても、
多くの部分がコンパイルの過程で正格評価になるような気が・・・
546デフォルトの名無しさん:02/05/06 10:55
>>545
たとえば?
547デフォルトの名無しさん:02/05/06 11:38
548デフォルトの名無しさん:02/05/06 14:39
>>546
例えばって、意味がわからん。
549デフォルトの名無しさん:02/05/06 23:51
藁藁
550デフォルトの名無しさん:02/05/07 03:44
Haskellで10万くらいの階乗計算を再帰でやらせてみたら、
こけたので(スタックが溢れた)驚いたことがあったな。
551デフォルトの名無しさん:02/05/09 01:49
Haskellで不毛気味な議論が炸裂中につきアゲ。

IOモナドの見た目副作用を普通に使って書かれてるプログラムと、
MLで、関数型の本意ではないって事で控えめに副作用を使ってかかれた
プログラムと、どっちがどっちだろうとかは思うね。
むしろ健全に副作用を副作用として生かして最小限につかえるMLの方が?

純関数型とかいうならストリームで書けよな。
IOモナドってロジックに副作用が見え隠れするもん。
552デフォルトの名無しさん:02/05/09 02:07
補足しとくと
Haskellも好きです。嫌いじゃないです。
553名無しさん@お腹いっぱい。:02/05/09 11:55
>>551
こっちでmonadの話するのも何だかなーと思うけど、
"Combinig Monads"とか、"Cmoprehending Monads"とか読んだ?
ある程度定式化できるのがmonadのよいところ。
554デフォルトの名無しさん:02/05/09 16:40
副作用もちゃんと定式化できるよ。"effect system"で検索…しても駄目かな(笑)。
そもそもMonadにしても、副作用を定式化するためにMoggiが使い始めたのを、
Wadlerあたりが今みたいな使い方を言い出したというか。
555デフォルトの名無しさん:02/05/10 17:10
どなたかコンカレントMLを使ってみた人はおられるか?
マニュアルとかがちゃんと無い(よなきがする)ので、
いまいちつかいかたがわかんないのだが・・
556デフォルトの名無しさん:02/05/14 14:27
open CML;
let val c = channel()
in spawn(fn _ => send(c, 123));
  recv c
end;

とか。って言ってから漏れの環境で試してみたらBus Error...
インストールに失敗したか?
557533:02/05/16 17:32
>>554
ごめん、ちょっと説明不足だったけど、
>>551の話しているprogramming techniqueの話のつもりでした。

Semanticsの方はMoggiが専門だよね。
`Monadic Encapslation of Effects: A Reviced Approach (Extended Version)'
semanticsとprogramming techniqueの両者の橋渡しにもなっていて面白いと思うよ。
558デフォルトの名無しさん:02/05/17 11:17
>>557
すげえ、よくそんな論文がすぐに出てくるな。研究者の方?
http://www.research.avayalabs.com/user/wadler/topics/monads.html
にあるThe marriage of effects and monadsも同じような話だったかも。

っていうか、またMLスレじゃなくなりつつある…(笑)
559デフォルトの名無しさん:02/05/20 01:36
smlnjってどうなってんの? もう4年ぐらい公式リリースがないような…
嫌気が差して辞めたんだろ
561デフォルトの名無しさん:02/05/20 03:23
ML2000はなかなか萌える仕様だし、
CMLも使った事はないものの、面白そうなのである。

出せ出せだせ〜
>>561
>>195が「出ない」と言ったのを見た私。
それでもあなたに同意する私。
SML/NJ 110.40でた。
564デフォルトの名無しさん:02/05/27 20:22
565デフォルトの名無しさん:02/05/27 20:38
えすくーえるも関数型なんでしょ
ちがうと思う。
567デフォルトの名無しさん:02/05/27 21:02
566に反論してくれ↓
えくすーえるとは?
えすくーえるか・・・
570デフォルトの名無しさん:02/05/28 14:16
Excel
とかいってみるテスト。
571デフォルトの名無しさん:02/05/29 00:05
SQL
SQLはどちらかといえば論理型では?
つか、なんともいえないが。
573あげあげ:02/06/05 20:58
humhum、まいくろそふとりさーちが関数言語関係者召喚した理由が見えたよーな気がする。
来年あたり、プログラマの流行は関数型言語、
再来年あたりのIA64拡張機能の目玉は、関数型言語primitiveの実行効率向上

とか妄想してみる
妄想だ。確かに妄想だ。>>575
577デフォルトの名無しさん:02/06/06 10:27
F#を皮切りに・・・
関数型言語が広まるといいにャ〜
578デフォルトの名無しさん:02/06/06 12:31
FIMLってなんだろうな?

ジャックさんが日本語のページも作ってくれるとわれわれアホ共も
なだれ込めるのだが・・

ジャックさんは日本語が結構得意だったはず。
ああ、日本語のページがほすい。
579デフォルトの名無しさん:02/06/06 12:31
580デフォルトの名無しさん:02/06/14 10:31
F#って動くの?
なんかうまくうごかんかった。
581Obj.magic:02/06/14 20:43
test
582デフォルトの名無しさん:02/06/17 11:52
質問でございます。

SMLNJにソケットをつかったプログラムを移植しようとしているのですが、
普通の入出力はなんとなくわかったものの、ソケットを使う方法がよくわか
りません。

簡単なサーバアプリとクライアントアプリをとりあえず動かそうとしておりま
すが、ソケット自体どうやったらいいものかわからずにとまっています。

どなたか親切な方、もしよろしけばれば・・
583デフォルトの名無しさん:02/06/26 00:45
ocamlにしよう!
と身も蓋もないことを言ってみるテスト

でも、なぜsmlnj?
sml.NET available
585デフォルトの名無しさん:02/06/29 17:33
SML.NETのぺえじ
http://research.microsoft.com/Projects/SML.NET/
>NEW: SML.NET has now been released.

SML.NETのぺえじ
http://www.cl.cam.ac.uk/Research/TSG/SMLNET/

ヤターって感じ。
586デフォルトの名無しさん:02/07/01 20:42
MLをアカデミック用途?に利用されている方にお伺いします。

もともとMLはMetaLanguageの名前のとおり、定理証明系のようなものを
作るための言語として使われていたと聞きます。
そのように使うにはどうしたらよいのでしょう。

といいますのは、今LISPで言語上に言語を作るようなことをするように
いわれているような状態なのですが、これを出来ればMLでやりたいのです。

LISPを使って、LISP上に言語を作る方法はなんとなくわかっておりますが、
MLではどうするのでしょう。
関数などを定義しておくだけでしょうか?
それともインタープリタをつくるのでしょうか。
587デフォルトの名無しさん:02/07/01 23:44
>>585
このライセンスって、良く見るBSD風のライセンスだと思うけど、
http://www.cl.cam.ac.uk/Research/TSG/SMLNET/licence.htm
こういうライセンスの場合、SML.NETでコンパイルして生成した
実行ファイルにはこのライセンスによる制約は何も課されないと
考えていいんだよね?

コンパイルによって生成されたファイルはSML.NETの一部を含んでる
わけではないので、University of CambridgeのCopyright表示などは
しなくても良いわけですよね?
>>586
私もよくわからないんだけど、MetaLanguageなのは、定理証明系
を記述した言語という意味じゃなくて、定理証明系において、定理証明
の過程で中間的に用いられる戦略もしくは、証明文そのものを記述する時に
使われた言語という意味なのでは?
おそらく意味論が数学的にきっちり定義されているのだと思う。

>>586

プログラミング言語を作るにはsyntaxとsemanticsを決めなければならない。
syntaxといってもユーザの入力するsyntaxと内部表現に対応したsyntaxはこと
なるので、ここでは内部表現の方のsyntax(これをabstract syntaxという)に
集中しよう。syntaxを決めるにあたってよく使われるのがBNFというやつだ。
例えば超簡単なプログラミング言語を考えてみた。

C ::= 0 | 1 | 2 | ...
V ::= a | b | ... | z
E ::= C | V | E + E | E - E
P ::= V <- E | print E | P ; P | while E do P end

制御構造はwhileループだけ、式には代入、加減算、表示がある。変数はなぜか26個。

もしlispだったらこの言語のプログラム
while 1 do print 0 end
を次のS式
(while 1 (print 0))
で表すんじゃないかな?

ML(ocamlですまん)で文を表現する場合はまず、次のように型宣言をするだろう。

type const = int
type var = char
type exp = Const of const | Var of var | Plus of exp * exp | Minus of exp - exp
type prog = Update of var * exp | Print of exp | Seq of prog * prog | While of exp * prog

通には冗長に見えると思うが、ここでは論点を強調するためあえてこのように
してみた。ここで強調したいのはconst,var, exp, progそれぞれの型がBNFの
非終端記号C,V,E,Pに対応していることだ。さらに、それらの終端記号の構成
方法と、対応した型の型コンストラクタが対応していることだ。たとえばBNF
は「V <- E」という文法がPの要素であるとしている。これには「Update of
var * exp」が「prog」型のデータを構成するという宣言に対応している。

だからさっきのプログラムの例は
While (Const 1, Print (Const 0))
というMLの式で表される。

Lispとの違いは構文規則と型の定義が対応しているから、もし規則に反する
文を表現しようとしたらそれが型エラーではじかれることだ。例えば
print (x <- 3)
なんて式は本来文法の文にはならない。MLではこれに対応した表現
Print (Update ('x', Const 3))
をは型エラーになる。Lispだと
(while (update "x" 3))
というS式はべつにあってもなんともないので、これを処理するプログラムの方で
弾いてやらなきゃいかん。syntaxはこんなところかな。

長くてすまん。
590589:02/07/02 01:48

ところがおいらは定理証明系を作ったことがないのでこっから先はよく知らん。
詳しくはPaulsonのML for the Working Programmerを見ておくれ。最後の章だっ
たかな?

PVSを使ってみた感じでは、実装したい論理の文法を定義したら多分次に証明
系を構成する要素(context, inference rule)を実装していく。んで、ゴール
をinference ruleを使って分解するためのunificationを書く。そしてそういっ
た分解手続きをプログラミングするためのライブラリを整える、つー感じかな?
勝手に妄想してみました。

MLには定理証明を実装するのにあるとうれしい機能が積極的に追加されている。

* そもそも定理証明系にエラーがあっては話しにならない。とりあえず
型エラーだけでも無くそう => MLは強い型付け
* どうも定理証明をやるとき、ひとまとまりの手順(関数)をプログラム内で再利用できれば
うれしいようだ。あるいは関数で表現できるデータ構造があるときれいに書ける
=> MLは高階関数がある
* unificationにこけたときにすぐに抜けれるとうれしい => 例外
* つーか同じ関数を別々の型で定義し直すのはつかれた => 多相的型付け

Metaであることの意味は586,588両方が正しいのではなかろうか。

定理証明系の実装っつーの普通のはプログラミング言語の実装と違う気がする。
ある形式化された論理をさらに計算機の中で形式化(実装)し、その論理の推論
規則に従って証明をする、という人間の営みを忠実に計算機の中で実現する、
というのに近い。

個人的には電卓と似たようなものだと思う。電卓は人間が「1+2+3」を紙で計
算するところをキーをパチパチうちこんで機械に計算させる。そんな感じで、
黒板の前でうんうんうなるかわりに定理証明系に最初にゴールを入れて、あと
は手でゴールを分解して証明していく。メリットは証明手続きを(ちょっとば
かし)自動化できること、あと人間のケアレスミスを排除できることかな? 電
卓でもそうだよね。

また長かった。逝ってきます。
591589:02/07/02 01:58
さらにうざいフォローだが読み返して
589と590のつながりがちぐはぐなのに気づいた...
いや、プログラミング言語がつくりたいのかなーと思って589を書いたら
どうやら定理証明系が作りたさそうなのに気づいたので、こうなりました。
592デフォルトの名無しさん:02/07/02 20:08
ありがとうございます。
書き込んだときにはレスつかないかと思っていたので、感激しました。

MLで言語を作るとCなんかに比べるとかなりすっきり書けそうですね。
>While (Const 1, Print (Const 0))
とりあえず、こういうのを人間が直に書いて動くものをつくろうかと思います。

書き足りなかった事を書き足しますと、
作らなくてはならないものはAI関係のもので、
LISPの上に言語を構築したりするのがありがちと思われるものです。
(あまり詳しく何をするかは書き込んではいけないのでご容赦ください)

LISPには堪能ではないので聞いたままでうまく書けませんが、
LISPだと出来上がった言語は基本的にS式で記述し、それをevalなどを
使って動かすんだそうです。
新たに言語をつくるというより、言語の上に言語を乗せるほうが簡単
というような感じです。
でもMLではevalみたいなことや、マクロが無いのでLISPでやっている
ことをそのまま持ってくるのは無理かなと。
593Super Combinator:02/07/02 22:13
http://www.faqs.org/faqs/meta-lang-faq/
http://www-2.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/top.html
辺りで実例を探せば?

Lispの方が楽な局面が多いと思うけどね。
LCFみたいなのは静的な数学が相手だからいいのだろうけど。

http://www.cs.cornell.edu/Info/Projects/SimLab/releases/release-1-0.html
とかさ。Common Lisp, CLOSをdefsystemやread macroでちょと拡張して。
594デフォルトの名無しさん:02/07/12 21:49
SML of New Jerseyで以下のソースを入力したのですが、
Error: syntax error: deleting EQUALOP ID
というエラーが出ます。どこが間違っているかわからないのですが、
教えてもらえませんでしょうか。
入力ストリームを出力ストリームにコピーする関数で、この関数を用いて
入力ファイルを出力ファイルにコピーするプログラムを作ろうとしています。

open TextIO;
fun copyStream ins outs =
if endOfStream ins then ()
else case input1 ins of
SOME c => (output1(outs, c);
copyStream ins outs)
| NONE = > copyStream ins outs
;
NONE = >の所で=と>の間をあけちゃだめなんじゃない?
あー・・・ホントだ・・・気づかなかった・・・。
ども。お騒がせしました。
597デフォルトの名無しさん:02/07/13 12:33
下のような、複数をファイル名のリストと出力ファイル名を引数とし、
関数InAbcOutを使って入力ファイルに処理を加えて出力ファイルに出力する
関数を作ったんですが、syntax error: deleting BAR ID LPARENと
syntax error found at RPARENというエラーがどうしても取れません。
どこが間違ってるんでしょうか・・・?
関数InAbcOutの型はval InAbcOut = fn : string -> string -> unit
で、ここまではエラーは出ていません。

fun abc nil outf =
| abc (n::L) outf = InAbcOut n outf
            abc L outf
;
598ふわふわ名無しさん:02/07/13 15:58
何がしたいんだかよくわからんけど
1. nil -> [] ?
2. 前者の定義のボディがないよ。 () ?
3. 後者の定義のボディは (InAbcOut n outf; abc L outf) としたいの?
599597:02/07/13 16:14
nilは空リストです。
リストの要素である入力ファイル名が関数の再帰呼び出しで一個ずつ減りますよね?
で、入力ファイルが無くなったら何もせずに終了、と。

前者っていうのはnilが来たときの動作ってことでしょうか?
リストの要素が無くなって空リストが来たら終了させたいんですが。。。

後者ってのは二行目以降ですよね?
InAbcOut n outfで、リストの先頭の要素に処理を施してoutfに出力した後、
abc L outfで関数abcを再帰呼び出しして、リストの次の要素に同様の処理を
再帰的に施していきたいんですが。。。
600ふわふわ名無しさん:02/07/14 17:41
>>599
> 前者っていうのはnilが来たときの動作ってことでしょうか?
> リストの要素が無くなって空リストが来たら終了させたいんですが。。。

だからって何も書かなくてよい訳じゃないでしょ?

> 後者ってのは二行目以降ですよね?
> InAbcOut n outfで、リストの先頭の要素に処理を施してoutfに出力した後、
> abc L outfで関数abcを再帰呼び出しして、リストの次の要素に同様の処理を
> 再帰的に施していきたいんですが。。。

改行は式の区切りにはならないでしょ?
597 のままだと InAbcOut n outf abc L outf という式になっちゃってますよ。

どうでもいいけど、abc list outf よりは abc outf list の方がいいとおもふ。
601デフォルトの名無しさん:02/07/16 03:24
>>592
> LISPだと出来上がった言語は基本的にS式で記述し、それをevalなどを
> 使って動かすんだそうです。

これをMLでやろうと思ったら、combinator(SK-combinatorとは別物)として
実装すれば良いはずなんだが、あまり参考になる文献がないな…
Haskellの世界だとparser combinatorとか、わりと有名なんだが、
MLでも同等のことができる(はず)。って、ほとんど情報量がなくてスマソ。

ちなみに589は何者^^; すごい正確な認識…
602デフォルトの名無しさん:02/07/18 01:05
上げる。
603デフォルトの名無しさん:02/07/24 13:08
f#とかsml.netとかあるんだね。
いろいろ制限あるみたいだけど。
604デフォルトの名無しさん:02/07/28 08:30
Ocamlの日本語ページ誰か作らないかなあ?

#私?私に出来るならとっくにやっとる!
605f ◆KRQhL3K2 :02/07/29 22:03
606デフォルトの名無しさん:02/07/29 22:41
a
607Obj.magic:02/07/29 22:43
>>604
やってるんだが、なかなか進まない。
608デフォルトの名無しさん:02/07/31 19:22
>>604
http://www10.u-page.so-net.ne.jp/dk9/mamewo/ml.html
この辺とかにあるみたいだけど?
..誰だろう?と思ったらまたしても米澤研の人だったよ (^^;
609デフォルトの名無しさん:02/08/13 01:15
>>375
禿げしく遅レスだが、保守ageってことで、
健全性と完全性(狭義)を2つ合わせて完全性(広義)というぞ。
610デフォルトの名無しさん:02/08/13 05:12
大堀先生のMLの入門書の最後のほうに書いてある課題をやっているんですけど、
課題3の型を推論する機構を実装する方法がさっぱりわからん。

参考書にあがっている「プログラミング言語の基礎理論」買いましたけど、
難しすぎてぜんぜん参考にならないんですけど・・・
もうちょっとわかりやすく説明している本ってないですか?
611デフォルトの名無しさん:02/08/19 08:07
すみませぬです。
MLに堪能な方からすると実にくだらぬ質問だと思います。

datatypeでラベルを使いたいのですが、どうやったらいいのか解りません。

datatype hoge =
Person of {name : string , address : string };

のようなことはどうやったら出来るのでしょうか?
(あんまりな例ですみません)
MLのインタプリタある?
なんかあった気がするんだけど・・・
614デフォルトの名無しさん:02/08/19 23:47
>>611 は私も気になるなー
できないような気もしない事も無いけど。

できないなら、こういうときはどうすべきなのかしら。


ところで、
いまから取り組むなら
SMLが良いのでしょうかOcamlでしょうか?
あるいは、SML.NETとかF#などをいきなりはじめたりする方が良いのでしょうか?

書籍などの情報はSMLしかないですよね?
http://caml.inria.fr/oreilly-book/

プリントアウトして読む。
616610:02/08/20 02:49
>>612
情報サンクスです。
ちっと大変そうですが、気合を入れて勉強してみます。
OCamlの基礎ならこんなのもあるよ。
http://www.is.titech.ac.jp/~wakita/classes/cs2-2001/handout1.pdf
OCaml v3.06 available
619デフォルトの名無しさん:02/09/02 15:19
StandardML入門、数学の知識がなさすぎて難しい。。。。
620デフォルトの名無しさん:02/09/07 17:51
>>604
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html
# すみません五十嵐さん、紹介しちゃいました。
621デフォルトの名無しさん:02/09/15 01:47
質問です。
ML版に、JSPのような埋め込み言語のライブラリ(?)ってあ
りますか?

Googleで「ML+html」で検索しても、もちろん当たりません(^^;
(このような埋め込みの機構って、正式名称はなんだろう?)
>>621
なんかそんなの前に見た気がする。

これかな
http://ellemose.dina.kvl.dk/~sestoft/msp/index.msp
ML server pages (version 1.1)

その他
http://www.cs.princeton.edu/~appel/smlnj/projects.html
Implementation work using ML
623デフォルトの名無しさん:02/09/15 02:06
>>621
そういうことがOcamlで出来たら感激で鼻血が出そうだ。
624デフォルトの名無しさん:02/09/15 02:26
>>622
ありがとうございます。ML server pagesを使ってみます。
(正式名称は、server pages?)
625デフォルトの名無しさん:02/09/20 13:44
すみません、SMLなんですけど、
datatype 'a tree = Nd of ('a * (('a tree) list));
というデータ型はどういうデータなんでしょうか?
例えばaをint型とした場合、Nd(1, [Nd(1, […, …]), Nd(1, […, …]), …]);
という形になると思うんですが、通常のtree型と違ってEmptyの定義がないために、
一番先の葉の部分をどういう風に記述していいのかわかりません。
このデータ型はどういうふうに表せばいいのでしょうか?
626無名関数:02/09/20 23:36
>>625
葉=子がない=子ノードリストが空
627デフォルトの名無しさん:02/09/21 00:40
ということは…の部分は空白というか何も入れなくてもいいってことでしょうか?
628デフォルトの名無しさん:02/09/21 04:26
>>625
int list の例
[121, 324, 44];
[555];
[];
629デフォルトの名無しさん:02/09/21 14:30
えーと、int listはわかるのですが、Nd of ('a * (('a tree) list))だから、
aの型がintの場合、Nd(123, なんとか)という形になって、なんとかの部分が
(('a tree) list)だから、tree型のリストになりますよね?
だから、Nd(123, [tree型のデータ, tree型のデータ, ...])となりますよね。
で、tree型のデータはNd(234, なんとか)みたいに表されるから、
626さんの説明を見ると、葉の部分は子ノードリストが空だから、nilか[]で、
つまりNd(123, [Nd(234, nil), Nd(345, nil)])とか、Nd(123, nil)
のような形になると思うんですが…。合ってますでしょうか?
…627に書いたのは間違ってましたね。空でも空リストが要りますから。
630デフォルトの名無しさん:02/09/26 20:37
MLtonがFreeBSDに対応age
http://www.mlton.org/
ほうほう
632デフォルトの名無しさん:02/09/29 17:00
プログラミング言語MLって本の練習問題を解いているんですが、、、
実数リスト中の最大要素を計算せよって問題なんですが、、、、
fun list_max(L:real list) =
if tl(L) = nil then
hd(L)
else
if hd(L) > list_max(tl(L)) then
hd(L)
else
list_max(tl(L));
で良いのかと思ったらエラーが出るです。
何ゆえですか???
633デフォルトの名無しさん:02/09/29 19:34
>>632
"tl(L) = nil" のところで = で比較しちゃってるので L の要素が
equality type でなきゃいけない。で、real は同値判定「できない」
ことになってるんでこういうエラーがでる。
こういうときは null 関数とかパターンマッチを使おう。
sml 使いが一度はハマル FAQ だね。

あと、632 のプログラムだと list_max(tl(L)) を2回計算してるんで
値の順序によっては30要素くらいでもう値が返ってこなくなるよ。
ちゃんと let とかを使おう。

fun list_max [x : real] = x
| list_max (hd::tl) =
let val tl_max = list_max tl
in
if hd > tl_max then hd else tl_max
end;

元のスタイルのままパターンマッチにしてみた。

ちなみに、real list 同士が比較できない理由だけど、
[1.0] = [1.0] を判定するためには 1.0 = 1.0 の判定が必要だよね。
real 同士が = 比較できないんだからこれは無理。
nil の場合だけ特別扱い……なんてことはしてくれない。
635632:02/10/01 02:00
>>634
有難う御座います。m(_ _)m
なぞが解けました。
fun list_max(L:real list) =

fun list_max(L) =
にしたら L がint listになって、こっちはエラーも出ず正常に
動作したので、余計混乱していたのでした。

> ちゃんと let とかを使おう。
質問当時ML初めて二日目でしたので、letをしらないので御座いました。
634さんが書き直してくれた奴は、まだ僕の知らない文法なんですが、
頑張って解読します。
636Obj.magic:02/10/01 15:06
すみません、Ocaml の Obj.magic 関係で質問させて下さい。
エラー出力に改行付きで出力してすぐ flush する prerr_endline のフォーマット付きバージョンがあると
便利なので、
# let efprintf fmt = Printf.eprintf fmt; print_newline (); flush stderr
と定義したのですが、
# efprintf "foo = %d" 2;;
This function is applied to too many arguments
と怒られてしまいます。
printf.mlを参考に書き直してみても同じでした。
あると便利そうなんですが、誰か解決法をご存知の方はいらっしゃいますか?
Obj.magic ってマニュアルにも載ってないような..。
637Obj.magic:02/10/02 01:19
>> 636
Obj.magic はわざとマニュアルに載せてません。

載せるとみんな使い出して seg fault 出した後で、
「O'Caml って type safe じゃねー。使えん。」とか言い出されると困るので。

> エラー出力に改行付きで出力してすぐ flush する prerr_endline のフォーマット付きバージョンがあると
> 便利なので、

今から *printf/*scanf マスターの Pierre Weis に会うので efprintf 頼んでおきますが、
これに限らず、機能が欲しかったら思い切って Caml-list に要望を書きこむと吉かも。
638デフォルトの名無しさん:02/10/02 02:16
>>636

とりあえず
let efprintf fmt = Printf.kprintf (fun s -> prerr_endline s; "") fmt;;
で 90% くらい実現できるんじゃないかな? 返り値が () じゃなくて "" に
なっちゃうのが美しくないけど。

# これに限らず stderr が non-buffering だといいのにと思うことはありますね。
639Obj.magic:02/10/02 03:02
>> 636

Pierre 曰く、「ワシが書いた Format.*printf を使うのじゃ」

# Format.eprintf "foo = %d@." 2
foo = 2
- : unit = ()

以上。

format string の typing は tricky なので、FAQ に載せるべきかもね。
(もう載ってるか?)

Obj.magic はマニュアルもなにも、C のキャストみたいに
無理矢理タイプを変えるもんだと思えば Ok。
type system を騙す時にやむなく使ったりする。

# (Obj.magic true : int);;
- : int = 1
# (Obj.magic 0 : bool);;
- : bool = false
# (Obj.magic "hello" : int);;
- : int = 537914958
# (Obj.magic 1 : string);;
Segmentation fault
640636:02/10/03 16:32
皆様素早いレスThanksです。

>>639
Format.eprintf 良さげですね。
ただ、@.を付けて flush を明示しないといけないという点では変わっていない
という気も..。

>>638
> let efprintf fmt = Printf.kprintf (fun s -> prerr_endline s; "") fmt;;
> で 90% くらい実現できるんじゃないかな? 返り値が () じゃなくて "" に
> なっちゃうのが美しくないけど。
Printf と同じように使えるので今これを使わせていただいてますが、返り値が unit でないので
begin .. end 内などで使うと warning が出るのと、他の unit を返すコードと型が合わない
というエラーになることがあるのだけが問題ですね。

Format.eprintfの引数に強制的に "@." を付加するコードを書いてみましたが、
やはり同じエラーでした。うーん。

> # これに限らず stderr が non-buffering だといいのにと思うことはありますね。

そうですね。
641デフォルトの名無しさん:02/10/12 22:22
どなたか、MLjをつかって、robocodeに挑戦している方いませんか?
一応、なんとか対戦は出来るところまでいったんですが、
Javaでいうpackageがうまく使えないので、robocodeプログラムに
MLjで作ったロボットを認識させるのが手間で。。。
どなかたうまい手をご存じないでしょうか?
具体的には、下記のソースをMLjのプロンプトから、
\ export test.MLjRobo MLjRobo
\ make
とやって出来たtest.zip を手動で解凍してすべてのファイルを
robocode\robots ディレクトリにおいています。(こうすると、robocodeに認識される。)
(* filename: test.sml *)
structure test =
struct
local open robocode; open java.awt;
in
_public _classtype MLjRobo _extends robocode.Robot {
_public _constructor(){ _super() }
_public _method run () = (
this.#setColors(Color.black,Color.blue,Color.green);
while true do (
this.#ahead(100.0); this.#turnGunRight(360.0);
this.#back(100.0); this.#turnGunRight(360.0)
))
_public _method onScannedRobot(e:ScannedRobotEvent option) = this.#fire(1.0)
_public _method onHitByBullet(e:HitByBulletEvent option) = (
case e of
SOME ev => this.#turnLeft(90.0 - ev.#getBearing())
| _ => () )
}
end (* local *) end (* struct *)
PVSで、サーチしたらここが引っかかったよ。2chスゲー(笑)

>>590
>PVSを使ってみた感じでは、実装したい論理の文法を定義したら
>多分次に証明系を構成する要素(context, inference rule)を
>実装していく。んで、ゴールをinference ruleを使って分解する
>ためのunificationを書く。そしてそういった分解手続きを
>プログラミングするためのライブラリを整える、つー感じかな?

てゆーか、証明アルゴリズムって実際resolutionとかtableau method
とかいうのと、あとは述語論理の場合unificationくらいでしょ。

そういえば、最近のPVSはShostak法とかいう不等式決定方法が追加した
みたいね。式の移項程度のレベルだと自動で証明できちゃうみたい。

#ちなみにPVSは、Allegro LISPでインプリメントされてます。
つーか,でかい証明を書くにはtacticsとかtacticalsが重要.
実際に証明を書いて見れ.
644642:02/10/15 20:05
>>643

ちなみにPVSではstrategyっていいます。

・・・って勘弁してくださいよ(笑)

>>642で書いたのはあくまで自動証明の基本ですよ。
これが即、実用レベルで使えるなんていってないっすよ。

そのうち、自分でも書いてみようと思うけど、
今はexampleの証明読んで勉強するっす。
大堀本ゲットーーーーーー!!!!!!
646デフォルトの名無しさん:02/11/05 17:09
大堀本ってこれだけで独習しようとすると、後半まったく分からなくなる。





…ってことない?
なんかシグネチャとかストラクチャとか、説明を省略しすぎ。
おれまだ入門途中で止まってる。
647無名関数:02/11/05 21:59
>>646


最初はUllman本の方がええよ。
Ullman自身、関数型言語を専門にしているわけではなくて、
この本もMLのプロからは評判良くないけど、
逆にいうと、関数型言語素人と同じ視点で書かれているから取っつきやすいかも。

その後で大堀本読んだら。

648デフォルトの名無しさん:02/11/05 22:38
>>647
ちなみにUllman本の第1版は本当にクソ。第2版ならなんとか許せる。
翻訳は第1版しかでていない上に、訳がダメダメ。

読むならやっぱり大堀本では?
649無名関数:02/11/05 23:05
まぁ、日本語のML本はこの二冊だけなんで、両方読んでみたら。
どっちも厚くないし。
二冊あるだけでもましかもね。CamlやHaskellは日本語本、無いよね?
あとは雑誌や大学のゼミのレジュメぐらいかな?
そういえば大堀さんがビットかコンピュータソフトウェアだったかに
書いた記事をどっかで見たなぁ。

どっちにしても日本語で勉強するにはリソースが少なすぎるので、
遅かれはやかれ英語文献を読まざるをえないけど。
650デフォルトの名無しさん:02/11/06 23:36
> 翻訳は第1版しかでていない上に、訳がダメダメ

「訳がダメダメ」は同感。でもこの訳者、なんでたくさん訳本出しているんだろ?
あるいは、なんでそんなにお声がかかるのかな。他の訳本を読んだことないけど、
たまたまMLの訳がダメだっただけなのかな?
偉いから。
652デフォルトの名無しさん:02/11/07 15:45
やっぱり締め切りをちゃんと守る人が(出版社にとっては)いいのでは?
どうでもいいけど、sml-njがsidのパッケージになってた
654_:02/11/19 10:43
Haskellに比べてモジュール機能が凄いらしいですが、どんな風にすごいの?
パラメーター取れるとか。
Functorのことかな。

たとえば、Mappingという抽象データ型があって、その実装としてすでに
HashMappingとかTreeMappingとかがあるとする。
Mappingのシグネチャを使ってDictionaryという別の抽象データ型を実装
する手段をFunctorとして与えると、ただちにHashやTreeを使ったDictionary
が利用できるようになる。

MLの最大の問題点。

どうも中途半端な感じがして、
いままでの言語でいいのでは?と思わせること
>>654
HaskellのType Classもなかなかいいよ。

>>655
まあ、別にCから乗り換える必要はないんじゃないの。
同じことをやれば、Cと同等かやや速いコードが出るし、バグは減るけど。
658デフォルトの名無しさん:02/11/20 08:29
.NETのMLっていつでるの?
660デフォルトの名無しさん:02/11/20 09:37
>>653
昔からあるじゃん
661653:02/11/21 18:29
>>660 ガ━━(゚Д゚;)━━ソ!シラソカッタ、ヲレイッテヨシ
662デフォルトの名無しさん:02/11/28 17:34
>>658
F#っていう、OCaml.NETみたいなのもあるヨ。
OCamlからCの関数を呼べるように、
F#からC#の関数を呼べるらしい。

http://research.microsoft.com/projects/ilx/fsharp.htm
663デフォルトの名無しさん:02/11/28 21:19
>F#
なんか無責任な名前・・
>>664-666
気味悪いから、なんか喋れ。
>>662-663
F# の F は France の F かの?
669デフォルトの名無しさん:02/12/10 23:52
x
670デフォルトの名無しさん:02/12/10 23:54
>>668
F# は Don Syme が作ったのでケンブリッジ製です。
OCaml.NET プロジェクトは INRIA にかつてあったので、
別の名前にしたんだと思われ。
671デフォルトの名無しさん:02/12/10 23:55
>>670 捕捉。だから「フランス」じゃないってこと。
Functional と言いたい所だが、実際は何かは作者しか知らんのではないか。
functionalだろ。
そんで、ハイブリッドだから、半音あげてるんだろ。
673デフォルトの名無しさん:02/12/11 14:42
MLでLISPにあるatomのような関数は作れますか?
もしできるなら教えて下さい。
>>673
宿題か?
675673:02/12/11 16:08
宿題ではないんですけど、それがあれば便利かなと思いまして聞きました。
>>675
このスレの>>2にあるリンク先の、flatに関する議論を読むべし。
677デフォルトの名無しさん:02/12/15 07:36
入出力や状態は具体的にどのように扱えばいい?
参照透明性を失わずにする方法があるって聞いたけど
他の関数型言語では何やらそういう仕組みが備わっているみたいだし。

例えばユーザーから1〜3を選んでもらって、それに応じて処理を変えるみたいの出来る?
無理じゃない?
678デフォルトの名無しさん:02/12/15 08:59
>>677
> 例えばユーザーから1〜3を選んでもらって、それに応じて処理を変えるみたいの出来る?

1. lazy evaluation & infinite list (Miranda)
2. monad (Haskell)
3. unique types (Concurrent Clean)

お好きなものをどうぞ。
679デフォルトの名無しさん:02/12/15 23:13
それらで不十分だと感じるから、この手のネタは尽きないのでは?
ファイルやTCP/IPなどストリームなものは1−3でよいのですがねー
イベントやキー&マウス入力等は、うまく扱えないのでは?
680デフォルトの名無しさん:02/12/16 00:09
>>678
SMLではどれが使えますか?
681デフォルトの名無しさん:02/12/16 04:38
コンカレントMLはどうやって使うのかおしえてください
682デフォルトの名無しさん:02/12/16 06:17
>>679
> イベントやキー&マウス入力等は、うまく扱えないのでは?

ネタだよな?
まさか1-3を知っててそんな事言ったりはしないよな?
>>679
キーやマウスからの入力を
TCP/IP上のテキトーなプロトコルに変換しちゃえばいいんじゃない?
>>683
別にTCP/IPじゃなくても‥‥‥
再帰的に扱えるシーケンシャルなデータになってればいいのでは
>>684
という考えをおしすすめていけば結局キーやマウスの入力って
ストリームとして扱えるじゃん。という結論に至るのではなかろうか
686デフォルトの名無しさん:02/12/16 22:04
>>681
これ読んでください。
http://www.amazon.co.jp/exec/obidos/ASIN/0521480892/
ってか、まだ読んでないので、読んだらどんな内容か教えてけろ。
687デフォルトの名無しさん:02/12/16 22:14
>>686
その本読んだよ、大学のシステムプログラムのクラスで使った。
が、その時はじめてMLを勉強したのでかなり難解であった。
っていうか、はっきりいってわからんかった。
688デフォルトの名無しさん:02/12/17 21:31
>>687
エッ!
大学の授業で使ったの?
差し支えなければ大学名を教えてください。
689デフォルトの名無しさん:02/12/17 23:31
アメリカの大学だよ・・・システムプログラムのコースで使ったんだけど
アメリカのコンピューターサイエンスのクラスじゃ結構このコンカレントML
の本は使われてるって教授がいってた。その教授はカーネギーメロンで
博士号とったMLオタクだけど。
690デフォルトの名無しさん:02/12/18 02:21
>>689
アメリカでは大学の授業でMLがよく使われてるのですか?
日本では東大、名大で使っていることしか知らないですけど。
>>690
ああ、うちの学校(アメリカ)でも使ってるよ、ML。
cmu出身の先生ってとこも>>689と同じだな (藁
ちなみにその先生、一番好きなのはModula-3だったりする。
692デフォルトの名無しさん:02/12/18 03:36
アメリカの大学では授業で何教えるも教授次第だから、なぜか大学にはいって
一番最初にとるプログラム入門のクラスが今までCだったのにMLにかわった。
693デフォルトの名無しさん:02/12/18 03:38
うちの大学は別に有名でもなんでもない普通の大学だけどML使ってます。
UCバークレーとかCMU、MITなどトップの大学にいくと普通にML使ってます。
694デフォルトの名無しさん:02/12/19 01:58
>>686
注文しました。

Amazonでの説明を見ると、実用的?なプログラムを例にとっていて面白そうですね。
a parallel software build system makeみたいなもんですか?
a simple concurrent window manager ウィンドウマネージャ
and an implementation of distributed tuple spaces これは何?
695デフォルトの名無しさん:02/12/19 02:12
でもその本にCMLの動かし方書いてないんだよね。作者のHPに気持ち程度
CMLの動かし方書いてあったけど。
696デフォルトの名無しさん:02/12/20 00:16
> 695
最近使っていないから知らんけどSML/NJについてくるんじゃないの?
昔はコンパイル時に選べばいいだけだったよ.
697デフォルトの名無しさん:02/12/20 01:59
CMLはSML/NJについてくるね。
MLベースの日本語扱える掲示板CGIってありますか?
699デフォルトの名無しさん:02/12/22 02:20
age
700デフォルトの名無しさん:02/12/23 17:10
MLベースの日本語扱えるHTTPサーバってありますか?
日本語を扱えるhttpdってどういう意味だよ
くれ あれ HTTP/1.2J

703デフォルトの名無しさん:02/12/24 20:36
よっしゃ HTTP/1.2J
ファイルのなかみ:エロムービー
ファイルの長さ:気がすむまで

はぁはぁ。
どぴゅっ。
ふきふき。
Windowsで使える実用用途向きなMLってどんなものがありますか?
WindowsAPIから外部のライブラリ(DLL等)やCOM、ActiveXが使えるやつ。
705デフォルトの名無しさん:02/12/24 23:12
OCaml
706デフォルトの名無しさん:02/12/25 02:08
>>704
.Netだけど、
 SML.Net
COMオブジェクトもtlbimpを通せば使えるのでは。
Win32APIやDLLはどうだろう。P/Invokeできるのか?

MLじゃないけど、
HaskellScript
>>704
F# [>>662] 、マ?
F#更新止まってねえ?
それとVS.NETなんかと連携できるんかね。
できないと、周辺環境が貧弱だが。
709デフォルトの名無しさん:03/01/06 23:54
ML系の関数型言語を仕事(研究以外)で使っている人いますか?
メインの言語として採用するのは難しいだろうけど、
補助ツールとかスクリプトとかで。
Lispをメインで使った仕事はたまにあるよね。
最近、Lisp使った仕事って、あったっけ?

E-lispとIPA仕事別にして。
711709:03/01/07 00:16
おいらもIPAしか知らないんだけどね。(^^;)
Lispでさえそれぐらいしか無いのなら、MLではなおさらかな。
712 :03/01/08 19:12
年は明けたが、…
>>575-577 は、やはり妄想であったか.....
>>43
あー、そっか。まぁしょうがないですね。
↓変なコピペ!
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
716デフォルトの名無しさん:03/01/10 00:21
保守
別にいいじゃん
どれぐらいやっちまったらIP抜かれて困るんだろう…
719デフォルトの名無しさん:03/01/10 01:08
F#ダウンロードできねえ。
http://research.microsoft.com/research/downloads/
720デフォルトの名無しさん:03/01/10 01:54
OcamlとOccamは違うのですか?
>>28
違います。判決は訴状送達の翌日(初日不算入の原則)からとしてます。
>>28
違います。判決は訴状送達の翌日(初日不算入の原則)からとしてます。
>>28
違います。判決は訴状送達の翌日(初日不算入の原則)からとしてます。
藪医者
と言うかあれですよ。
2ちゃんねるがなくなったら一番困るのはアンチじゃないかと。
低レベルな煽りやコピペ位しか出来ない連中は、2ちゃん以外じゃなかなか受け入れてもらえんだろw
まぁあれだ。半角だけはそのままにしておいてほしいと
「まとめ人指名制度」とかあればいいのにね
728@719:03/01/10 16:36
すんません
ダウンロードできなかったのは、JavaScript切ってあっただけでした
やばいこと書かなきゃいいだけじゃん。
>>345
逮捕されるような書き込みをする奴は僅かだろうし
荒らしはどうせ回避策をちゃんと取って来るし
2ちゃんねらは飽きっぽいので今までと変わらんと思う
いいですよ。
でも知り合いの勤めてるISPは使わないのがお勧め。
恥ずかしい事かけんもんね。
タカラのなんだっけ・・・モナーかギコネコ商標の件とか?
あ、これ内部告発じゃないか
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
伏字入れて書かかなあかんわけか・・・
IP記録しても管理人に削除義務があるのは変わらない。無意味なことやってるな。
あと、どんな人にも多少の「火」はあるもの。
それを勝手にネットに広めていいとは限らない。


<血液型A型の一般的な特徴>(見せかけの優しさ・もっともらしさ(偽善)に騙されるな!)
●とにかく気が小さい(神経質、臆病、二言目には「世間」、了見が狭い)
●他人に異常に干渉する(しかも好戦的・ファイト満々でキモイ)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする
(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはたいてい、内面的・実質的に負けている)
●「常識、常識」と口うるさいが、実はA型の常識はピントがズレまくっている(日本の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に弱く、弱い者には強い)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため、性格がうっとうしい(根暗)
●一人では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、体裁をいつも気にしている(「世間体命」、「〜みたい」とよく言う)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度も言う、知障)
●表面上意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をし、ストレスを溜めておきながら、他人に猛烈に嫉妬する(不合理な馬鹿)
●執念深く、粘着でしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。しかも冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(他人をけなして相対的に自分の立場を引き上げようとする等)


それと、O♀はエコヒイキきつくて、冷酷だからな。

A♂の異質排除×O♀の冷酷=差別・いじめ とあいなる。
神戸
それって窃盗?横領?着服?

まぁどーでもいいんだがw
>>日本にいるなら日本の法律を守れ
オマエモナー

「法律」をカンペキに遵守していると言うなら、
六法全書ぐらい全部暗記しているんだよな。凄い香具師だ。(藁
ドピュッ!タラーリ
閲覧したかどうかなんて侵害の事実と無関係だろ??
ソフトウェア板で誤爆が多いように思うんですけど、なんかおかしくなってるとかはないですか?
746山崎渉:03/01/13 18:55
(^^)

実質的には上告はもう無理らしい。

うれしいなぁ。


748デフォルトの名無しさん:03/01/15 15:10
関数型言語初心者ですが、MLを勉強しようとしています。
書籍をいろいろ探してみたのですが、すくなくて・・・
どなたかよい本知りませんか?
749山崎渉:03/01/15 18:09
(^^)
750デフォルトの名無しさん:03/01/19 01:04
>>748

プログラミング言語ML Ullman 著 アスキー出版局

プログラミング言語 StandardML入門 大堀淳 著 共立出版

Paulson本が翻訳されたらうれしいなぁ。
>>751
ていうか、この2冊だけだろ。日本語でわ。
752山崎渉:03/01/23 20:11
(^^)
753山崎渉:03/01/23 21:52
(^^)
保守
MLはLispの伝統に習って
処理系を自分で自作するような習慣が
あるのでしょうか?
>>755
Lispは構文解析がカンタンだから、自分で作っちゃう人が多いのでは?
MLは、ちょっと手こずりそうなのかも
型推論を実装するの面倒臭そう…
758デフォルトの名無しさん:03/02/11 16:03
O'Caml で質問です。
ocaml はリスト内包表記で [1 .. n] のようには書けないようですが、
同じことをするには関数を書くしかないのですか?

let rec count n =
let i = ref n in
let list = ref [] in
begin
while !i > 0 do
list := !i :: !list;
i := !i-1
done;
!list
end

759名無しさん@Emacs:03/02/12 01:17

[1 .. n] というリストが作りたいんでしょうか?
だったら、

let rec make_list current n =
if current = n then []
else current :: make_list (current + 1) n

でどうでせう。遅延評価とかは全然分からないので、聞かないで下さーい(はーと)
760デフォルトの名無しさん:03/02/12 10:12
>>759
そのプログラムでは、スタックがあふれますよ。
ocaml ではそんなこと気にしないのが流儀な気もするが。

# count 100000;;
- : int list =
[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21;
22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40;
(snip)
293; 294; 295; 296; 297; 298; 299; ...]
# make_list 0 100000;;
Stack overflow during evaluation (looping recursion?).

ところで、こんなリストを生成する関数はライブラリにはないの?
>756
型推論もさることながら、
もっと手前構文解析のところも気になります。
特に演算子を定義する部分はいったいどうやってるのかと。




…え?ソースを読め?
762名無しさん@XEmacs:03/02/12 11:30
>>758 あたり
関数型言語らしくいきましょうか

let make_list s e =
let rec loop lst n =
if n > e then
lst
else
loop (n::lst) (n+1)
in
List.rev (loop [] s);;

って末尾再帰の最適化してくれるよね(?)
>761
…と自分で書いているウチに答えが判った気がしてきた。

直に終端記号で演算子を扱わないでおいて、
優先度は決まった数しかないから優先度ごとに
「演算子優先度n」という非終端記号を前もって用意しておけばいいのかな。
あとは変数名や関数名と同様に対応付ければいいだけ?
let rec gen n =
[< 'n ; gen (n + 1) >]
;;
>>764
それって ocaml ですか? syntax errorって言われるのですが。
>>765
#load "camlp4o.cma";;
してから。

#load "camlp4o.cma";;

let naturals =
let rec gen n = [< 'n ; gen (succ n) >] in gen 0
;;

let _ =
let rec go_ahead () =
Printf.printf "%d\n" (Stream.next naturals);
go_ahead ()
in
go_ahead ()
;;

とでもやってみるべしべし
>>762
わざわざ List.rev をする必要はなし
let make_list from_idx to_idx =
assert (to_idx >= from_idx);
let rec loop prev_list prev_count =
if prev_count >= from_idx then loop (prev_count :: prev_list) (pred prev_count) else prev_list
in
loop [] to_idx
;;

長さ n のリストを生成するもっと短い書き方はありますか?
769767:03/02/17 20:18
let make_list n = Array.to_list (Array.init n (fun i -> i))

とかなら一行で書けるかな。
770767:03/02/17 20:22
769 で書いたのは、ある意味ネタだけど。こうも書けるということで。
771デフォルトの名無しさん:03/02/18 07:50
CMLについての資料はないかな?
よくわからんくてなかなか手をだせない。
>>771
関係ないけど、
concurrent ととなると最近は clean がメジャーなのかな。
caml にもあったよね。
>>772
Concurrent Haskellも有った筈。
>>355 の話を蒸し返して申し訳ないのですが、
どなたか解説して下さい。

Objective Caml version 3.06
# let id x = x;;
val id : 'a -> 'a = <fun>
# let id2 = id id;;
val id2 : '_a -> '_a = <fun>
# let id3 x = id (id x);;
val id3 : 'a -> 'a = <fun>

どうして、id2 は '_a になる?
η展開
778デフォルトの名無しさん:03/02/22 17:00
779デフォルトの名無しさん:03/02/26 20:23
【何処も】情報科学総合スッドレ【板違い】
http://science.2ch.net/test/read.cgi/rikei/1046173479/
そういえば、OCamlの翻訳はどこまで進行しているのかなー
781デフォルトの名無しさん:03/03/03 13:34
すみいさんが結婚退職してしまうのだ
782デフォルトの名無しさん:03/03/03 15:26
内輪の話されてもわからんねぇ
ま た 米 研 か ( 藁
翻訳は立ち消えであると、そういうことかな?
すみいさんに聞いてみないとわからないなぁ
マシンスタックとは何?
オペランドが0個のマシン。
そりゃスタックマシンだ
おい、お前ら。
OCaml で、module A, B, C が存在して、
A は、B にのみ使わせたいとき、それを実現する方法を教えて下さい。
789デフォルトの名無しさん:03/03/07 19:03
790デフォルトの名無しさん:03/03/16 16:53
camlでは、宣言する関数が再帰の場合に限って rec をつけなければならない事になってますが、何故?
処理系で簡単に判別できそうな気がするのですが、プログラミングの負担になるだけなのでは?
caml-listにポストすれば?
>>790
例えば f が型 int -> int を持つ自由変数のとき、
let rec f = f 1 と let f = f 1 は全く意味が違う。そもそも
前者は意味をなさない。
ある変数が自由変数かどうかはコンパイラはすぐに分かるが、
それが自由変数であるべきか否かというのは、
コンパイラには分からないのだ。

だから rec は必要。understand?
793デフォルトの名無しさん:03/03/16 23:17
> 例えば f が型 int -> int を持つ自由変数のとき、
ごめん意味不明。言いたいことは分かると思うけど。
「例えば f が型 int -> int を持っているとき」
に訂正。
>>792
今いちピンとこないのですが、…
SML の場合は関数が再帰かそうでないかで区別しないのに caml では区別するのは、
SML が関数と変数を区別するのに対し caml は区別しない事に依存するのでしょうか?

対応表:
 宣言\言語|SML|Caml
   変数 |val|let
 非再帰関数|fun|let
  再帰関数|fun|let rec
let、let rec と fun を対応させるのがマチガイじゃないかな……。
SML でも val を使って関数を束縛できるんですが御存じない?
その場合再帰関数には val rec を使うのですけれども。

796デフォルトの名無しさん:03/03/17 20:29
えと、
let f = ...
と書いた場合は、f が ... の中で束縛されていないのに対し、
let rec f = ...
と書いた場合は、f が ... の中で束縛されていることに注目するのが
よろしいかと。
ML である以上、関数と変数を区別するということの方がピンと来ません。
>>792-793,>>795-796
いろいろありがとうございます。
関数型言語では変数と関数を区別しないっていう事は理解できるのですが、
じゃ SML の fun って、いったい何?…という疑問が残ります。
再帰関数でもそうでなくても fun でいいのなら、その方が考えなくて済むから楽じゃん?
caml でも採用しる!?
>>797
caml でも、非再帰関数を let rec で束縛することは可能です。
その意味では、caml でも再帰関数と非再帰関数を区別しません。
また、やろうと思えば、後述しますが、let のみで再帰関数を
定義することも可能なのです。

>>796 で言いましたが、... の中で、f が束縛されているかどうか
の違いが rec なのであって、それ以上のことは何もないのです。
そして、>>792,>>793 でも言いましたが、caml は自由変数を許しているので
rec の有無で意味が変わりうるのです。


おそらく以上のことは SML にも当てはまると思われ。SML は caml に
比べてごたごたしているのであまり触ってないけれども。

ちょっと理論的なことを言うと、ラムダ計算では再帰関数は不動点を使って
表現することも可能 (Y combinator でググれ) で、Y combinator の引数の
与えようによって再帰にも非再帰にも出来る。λ計算の立場からは、
再帰か否かなんてことは、全く意味が無い。つまり、両者の区別は要らない。
あ、後述するとか言いながら、後述するの忘れた。
まあいいや。Y combinator でググれば答えは書いてある。

でも、-rectypes しないと caml では型エラーが出るので
そこんとこよろしく。
800800 get!:03/03/22 13:23
>>792-799 の議論をまとめると;
1. 自由変数の判断の為 rec の有無で意味が変わりうる
2. 再帰関数の宣言には普通 rec が必要だが、非再帰関数の場合 rec を付けても付けなくてもいい
3. SMLの fun は let rec の短縮形(たぶん)
4. Y-combinator を使えば再帰関数も rec なしで宣言できる

…というあたりでしょうか。
Y-combinator は ruby-list でも話題になってたんですね。
どうもありがとうございますた。
再帰で躓く様なら、schemeもやった方がいいかもしんない。
>>802
再帰で躓いているんじゃなくて、再帰の書き方でちょっとした
疑問を持っただけだと思いますが。

scheme をやったところで、scheme の場合、rec がずっと
ついているようなものだから、この疑問はでで来なかった筈。

んなこたーない
805デフォルトの名無しさん:03/03/23 16:08
あるよヴォケ
806デフォルトの名無しさん:03/03/23 22:03
letとletrecがSchemeにはあるんだが。
807デフォルトの名無しさん:03/03/23 23:17
>>805 は define と let を混同しているに 1000 ペリカ
808デフォルトの名無しさん:03/03/24 19:16
*MLでDLL作れますか?
(処理系はwindows用であればなんでもかまわないです)
もしできるなら、それをC言語とかで利用したいんです。
OCaml は作れる。他はしらん。
でも普通逆だろ。ML で C 使うんじゃないのか。
810デフォルトの名無しさん:03/03/24 19:57
>>809
ありがとうございます。
いや、MLで作ったプログラムを外部から利用できたら
面白いなと思いました。
トランスレーターとかはMLの方が書きやすそうなので。
811デフォルトの名無しさん:03/03/25 19:10
ocamlとCを連携させようとした場合 型の互換性とHEAP上のオブジェクトを
freeで解放するか GCで解放するかが問題になると思われるので注意。
812デフォルトの名無しさん:03/04/02 20:54
保守
OCAML って continuation 無いの?
SML には callcc というのがあるみたいだけど。

    http://merd.net/pixel/language-study/syntax-across-languages/
型付けが厳しいと、書き捨てのスクリプトを作るとき面倒くさそう。
その辺いかがですか? >> ML 使いのみなさん
日常的なスクリプティングも ML で済ませてる方いらっしゃいます?

;; ML があれば C 言語は要らないかも知れないけど、scheme は手放せないかも。
型付けが厳しいから、書き捨てのスクリプトを書く時も安心出来る。
817へたれ:03/04/08 22:20
書き方が悪かったかもしれませんが、書き捨てのスクリプトとは数行から数十行
程度の、安心より手軽さが重要な、アドホックなプログラムを指したつもりです。
そういうコードを書く時は、いちいち型を意識するのは面倒ですよね。もしかして
ML はそういった用途には向いてないのかなと思いました。対話的な開発環境が
あるので、書き捨てスクリプトを作る用途も意識した言語かなと思っていたのです
が。
型推論もありますが、面倒なのは型を記述する事では無く、型を意識してコードを
書く事なのであまり助けにならないように思います。型推論はもっと別の目的の為
にあるのかなぁと。

そんな事は無い、あらゆる場面で ML を使っていると言う方がいらっしゃったら
是非ご意見を聞かせて下さい。
>>817
>型を意識してコードを書く事なので
schemeで書くときだって型は意識するでしょ。
MLではさらに型の妥当性までチェックしてくれるよ。
ヒントになる式が含まれてれば。
当方よほどのことがない限りMLかshですが

型を意識しないでプログラムを書く方が異常。型を意識していないなら、
変数の中のデータも意識していないことになる。
もちろん、そんなヤツはいない。

MLで小さいプログラムを書く時に面倒なのは、コアーションがないことぐらいでは。
そしてそんな小さいプログラムでは、あまりコアーションを必要としない。
820へたれ:03/04/08 23:13
確かに型を意識しないというのは語弊があったかもしれません。
scheme も常識的な範囲で (+ 2 "foo") とかは出来ませんが、print_string とか、+. とか、
リストの要素の型は同じでないといけない等、 ML(O'Caml) は強く型を意識させられる
言語だなと感じました。それがありがたい局面は多々あると思いますが、小プログラムを
作る時には邪魔に感じるのではという疑問を感じました。

私はまだ ML の勉強を始めたばかりですので、識者の皆さんのお話を聞けたらと思いました。
おかしな事を言っていたら済みません。
821かおりん祭り:03/04/08 23:15
http://saitama.gasuki.com/kaorin/
〜oノハヽo〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄                
  ( ^▽^) < こんなのがございまーす♪ 
= ⊂   )   \_______
= (__/"(__) トテテテ...
>>820
>小プログラムを作る時には邪魔に感じるのではという疑問を感じました。
そういう事はお勉強終わってから言え。
でもリストの要素の型を統一しないといけないのは結構やなこともあるな。
他の言語の感覚でいると。
> でもリストの要素の型を統一しないといけないのは結構やなこともあるな。

# [`Int 3; `String "fugahoge"];;
- : [> `Int of int | `String of string] list = [`Int 3; `String "fugahoge"]

polymorphic variants というものもありますが?

(cond ((string? x) (anonfun1 x)
(int? x) (anonfun2 x)
...
))



match x with
| `Int x -> anonfun1 x
| `String x -> anonfun2 x
| ...

となる。

リストを作るときが面倒かもしれないけどね。
あ、condの括弧間違えた。まあいいや
ML のどんな所が楽しい?
メーリングリストと区別がつかない所、とか。
マークアップランゲージと〔以下同文〕
829デフォルトの名無しさん:03/04/11 14:55
MajiでLoveする5秒前。
型推論
しょんべん漏らすほど感動した
>>827-828
Modeling Language !?
832デフォルトの名無しさん:03/04/15 19:44
http://www.bagley.org/~doug/shootout/ のプログラムコードで比べると、
概して sml より ocaml の方がコードサイズが小さい様ですが、何でですか?
行数での比較なので正確ではないですが、ほとんどのテストで ocaml が短く、
Regular Expression Matching では smlnj:767,mlton:765 に対し ocaml:32
と20倍以上の差があります。
プログラマのスキルの差なのかな…にしては差がありすぎると思うのですが
> Regular Expression Matching では smlnj:767,mlton:765 に対し ocaml:32
> と20倍以上の差があります。

OCaml には Str module が有って、正規表現が書けるのだけど、
SML には正規表現ライブラリが無いのかも。しらないけど。

それはともかく、OCaml より SML の方がごちゃごちゃしてるのは事実。

Producer/Consumer Threads は文字列処理ないけど桁違い mlton:246,smlnj:178,ocaml:31
OCamlが速いのは、言語仕様の為に?
それとも処理系の実装の為に?
>Producer/Consumer Threads は文字列処理ないけど桁違い mlton:246,smlnj:178,ocaml:31
コードを読め。SML は Thread や Mutex を、このコードの中で
簡単に実装しているからだ。当然コードは膨れ上がる。OCaml には
Mutex も Thread も module としてある。それを使えば当然コードは
短くなる。

> OCamlが速いのは、言語仕様の為に?
> それとも処理系の実装の為に?

両方。関数型言語は tail recursion が仕様として義務づけられて
いたりするものもあるので、Ackermann's Function や Fibonacci Numbers
等では高得点を出しやすい。逆に、ハードウェアをフルに活用すればそれだけ
得点が出る Matrix Multiplication 等は C の方が速い。

ちなみに、OCaml は GC の為に 1bit だけ値にタグを付けているので、
引き算するときは、
sub eax, ebx
incr eax
の様なコードを吐かざるを得ないので、遅くなる。足し算は lea 命令で
一命令で頑張っているみたい。

OCaml は実装もかなり頑張っている。(それでも inline 展開がかなり保守的で、もっとやってくれても良いのに
と思うこともある)
>>836
smlnjやmltonには、それ用のモジュールが準備されてないって事でつか?
838山崎渉:03/04/17 15:22
(^^)
長さの等しい二つのリスト[a1; a2...; an]と [b1; b2...; bn]を受け取って,
[(a1, bn); (a2, bn - 1); ...; (an, b1)] を返す関数を書きなさい。ただし、

* nをあらかじめ知ることはできない
* 与えられた二つのリスト以外のリストを使ってはならない
* 再帰呼び出しは高々(n + 1)回しか行ってはならない
* 全体の計算量はO(n)でなければならない
840デフォルトの名無しさん:03/04/18 09:35
841山崎渉:03/04/20 03:09
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
842山崎渉:03/04/20 03:43
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
843デフォルトの名無しさん:03/04/20 16:05
age
exception SpError;
fun sp L M =
let
fun rev [] = []
| rev (x::xx) = (rev xx) @ [x]
fun sp1 [] [] = []
| sp1 [] x = raise SpError
| sp1 x [] = raise SpError
| sp1 (x::xx) (y::yy) = [(x,y)] @ sp1 xx yy
in sp1 L (rev M)
end
;

これじゃあいや、ということね?
> これじゃあいや、ということね?
はい、ぜんぜんだめ。
別の関数で再帰するのはダメ?
内部関数を作るのはあり。
> * 与えられた二つのリスト以外のリストを使ってはならない
答えのリストが作れねーのですけど。

# Ocaml
let f al bl =
let rec g al bl =
match al with
| [] -> ( [], bl )
| a1::al ->
match g al bl with
| _, [] -> failwith "hoge"
| pl, b1::bl -> ( (a1,b1)::pl, bl )
in
fst (g al bl)

ってこと?
849デフォルトの名無しさん:03/04/24 14:15
で、結局答えは何?
プロンプトの - を ~ に 減法の ~ を - にしたい
851デフォルトの名無しさん:03/05/01 08:16
>>850 Caml
まだリリースされてないけど。
Project: OCaml Eclipse Plugin
http://sourceforge.net/projects/ocaml-eclipse/

F#はだめぽ
854デフォルトの名無しさん:03/05/08 02:26
LML (LazyなML) なんてゆーのあるんですね。知らなんだ。
F#転んだらOCamlも道連れだろ。
>>848

(* OCaml *)
let f =
let rec g c l = function
| [] -> c l
| hd::tl ->
let h = function
| [] -> assert false
| hd2::tl2 -> (hd2, hd)::(c tl2)
in g h l tl
in g (fun _ -> [])

のほうが良くない?
「与えられた二つのリスト以外のリストを使ってはならない」という条件が曖昧だけど
途中でペアを返すのは微妙かと。
これだと末尾再帰になるし (やることは変わらんので実行速度も変わらんかも知れないけど) 。

>>848 が間違いだとはいわないけどね。

大して自信があって言ってるわけではないです。
この発言に間違い (やそれに準ずるもの) の指摘は
勉強になるので歓迎です。
>>856

これって効率いいの?
>>848 の方がいいとおもうんだけど。

> 「与えられた二つのリスト以外のリストを使ってはならない」という条件が曖昧だけど

let f xs ys = List.combine xs (List.rev ys)
とは書くなってことでしょ。
>>857 のつづき

それって末尾再帰で基本的に書けない map を
以下のようにして書いて、末尾再帰だ!って言ってるだけでしょ。

let map1 f xs =
let rec iter g xs = match xs with
[] -> g []
| x::xs -> iter (fun ys -> g (f x :: ys)) xs in
iter (fun x -> x) xs
859デフォルトの名無しさん:03/05/14 12:09
単に関数渡ししてるだけじゃん。
末尾とはいえ、再帰関数だし。
Schemeで書くとこういうのじゃないの?
(define (f a b)
 (define (g a b)
  (if (null? b) a
    (let ((x (g a (cdr b))))
     (set-cdr! b (car b))
     (set-car! b (car x))
     (set-car! x b)
     (cdr x))))
 (g a b) a)
861デフォルトの名無しさん:03/05/15 21:56
smlだと、こうなるかな。

exception NotSameLength;
fun f1 x y =
let fun g [] y = ([], y)
| g (x::xs) y =
let val z = (g xs y)
in if #2(z) = [] then raise NotSameLength else
((x,hd(#2(z))) :: #1(z), tl(#2(z)))
end
val t = g x y
in if #2(t)<>[] then raise NotSameLength else #1(t)
end;

>>852 ??
863デフォルトの名無しさん:03/05/23 10:06
Standard ML入門の問2.22を下のように書いたら
val emptySet = fn n => false;
fun singleton n = (fn x => x = n);
fun insert S n = fn x => x = n orelse S x;
fun member S n = S n;
fun union S T = (fn x => S x orelse T x);
fun intersection S T = (fn x => S x andalso T x);
fun difference S T = (fn x => S x andalso not (T x));

下のようになりました。このWarningはどういう意味ですか?
それとこの解答を添削してください。
2_22.sml:3.30 Warning: calling polyEqual
val singleton = fn : ''a -> ''a -> bool
2_22.sml:4.28 Warning: calling polyEqual
val insert = fn : (''a -> bool) -> ''a -> ''a -> bool
864デフォルトの名無しさん:03/05/25 18:41
なんか、MLが最強な気がする。
そんな感じの午後。
865デフォルトの名無しさん:03/05/25 20:05
>>864
それが通常の神経だ。ML最強。
じゃあなぜもっと流行らないのよう。
839の答えは何?
868デフォルトの名無しさん:03/05/25 21:41
>>866
みんなで使って流行らせよう
私は ML や Caml はもっと命令型プログラミングを
書きやすくなってほしい。書きにくすぎ。
今後は関数型も命令型も書きやすい言語が最強。
emacsのsml-modeで色をつけるにはどうすればいいですか?
871山崎渉:03/05/28 12:44
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
872デフォルトの名無しさん:03/05/28 21:43
>>870
放置しようとも思ったんだが
http://www.cis.ksu.edu/~allen/sml/sml-emacs.html
>>872
ありがとう。でも放置なんて・・・
874デフォルトの名無しさん:03/05/29 08:07
>>873
sml-mode で検索すればすぐに見つかるのだから、その検索さえしなかった
ものは放置で十分なのだ
875_:03/05/29 08:09
876デフォルトの名無しさん:03/06/01 21:37
この言語処理系は学問的には今のところ最新のものなのでしょうか。
javaやc++とどのくらい歴史的に若いというか新しい物なのかわかりますか?
877デフォルトの名無しさん:03/06/01 21:40
メーリングリストのスレかとおもった。
>>876
C with Classes 1980-
C++ 1983-
Java 1990-

ML 1973-
SML 1984-
Caml 1987-
OCaml 1996-
>>878
>C with Classes 1980-
なにそれ!
ml自体は古いんだ。
最も若い歴史を持つ言語処理系かと思った。
881デフォルトの名無しさん:03/06/01 22:27
>>879
C with Classesも知らないの? C++の前身でしょ?
haskellも80年代だった気がする
一番若いのはConcurrentCleanかな。
>>881
ObjectiveCは?
>>883
なにをとんちんかんなことを。
Objective CとC++は元がCであること以外はほとんど関係ないでしょ?
885デフォルトの名無しさん:03/06/01 22:38
ConcurrentCleanはクラスの概念があるようだから、オブジェクト指向をサポートしてるようだ。
OCamlより最先端というのが、オブジェクト指向サポートと結びつけるのもどうかと思うが、
なんとなく納得
Clean の評価戦略ってどうなっているの?
最左?
>>886 に自己レス
調べたら遅延評価だった。Haskellみたいなもんだね。
>>878
javaって1995年じゃなかった?
>>887
CLEANは、デフォルトでは、遅延言語である。

型定義に正格性注釈を使用することによって、データ構造と関数の評価順序を、遅延から正格に変更できる。
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport20/Chap10.html
890878:03/06/02 17:46
>>888
そんな気もする。てゆーか90年て何だ俺。
891デフォルトの名無しさん:03/06/02 17:48
>>889
そのマニュアルわかりにくすぎ
892あぼーん:あぼーん
あぼーん
>>885
クラスはクラスでも型クラスなのでOOPのクラスとは違う
関数型は言語パラダイムとしては最先端なのか?
最先端というより、数学が基盤だから色褪せないんじゃないかと。
>>891
おれもあれずっと読んでたら頭痛くなってきた。
わざと難解な表現使ってるとしか・・・
897デフォルトの名無しさん:03/06/02 21:31
やっぱり分かりやすさは重要だよね。
Clean言語報告はラムダ計算やグラフ理論の知識を前提にした議論をしてるから、
最初は読んでも分からんよ。
899898:03/06/03 14:21
グラフ理論というよりも、書換えシステムだな。
#quit;;
>>889
 そのページのホームを見ようとしても、
検索エンジンで見ようとしても、しよう
としたとたんにすぐ IE になにも表示
されなくなる・・・・なんでだろう。
で、次スレはどうするかということだが。
>>901
ウチではちゃんと見れるが

>>903
まだ早いでは
>>898
内容以上に訳が解り難いんだと思う。最初の段落だけでも、
>全種の効率性の詳細に悩むことなく、
>意味している
>時間及び/又は領域において
とか。
最初の文は「関数型言語でのプログラミングでは、効率性に関する細々とした事に心を奪われずアルゴリズムに集中することが重要である」
位に変えてしまえば、少しは読みやすくなろ。

(とは言っても草稿版らしいし、訳者も忙しいだろうし、仕方なかろうとも思う)
他にあります?
なにが?
>>905
読み易いかもしれんが、それは誤訳のような気がするのだが。
敷衍
910905:03/06/08 13:17
>>908
原文
>Programming in a functional language means that one should focus on algorithms
>and without worrying about all kinds of efficiency details.
直訳してみた
「(不特定単数の)関数型言語でプログラムを組む事は(不特定主体が)アルゴリズムに
注目すべきべきであって全種の効率に関する詳細に関しては心配すべきでないことを意味する。」
書き換えたのが905。
そんなに間違ってる?
重要性について語っているのではなく、
可能性乃至は蓋然性について語っているのではなかろうか。
つまり、関数型言語のプログラミングに限らずとも、
アルゴリズムにのみ集中できることは重要なのであって、
そのことを関数型言語でのプログラミングに限って語る実益はそれほど多くない。
むしろ重要なのは、
関数型言語でのプログラミングの場合、他のパラダイムの言語とは異なり、
プログラミング=アルゴリズムそのまま
という関係がかなりの可能性蓋然性をもって成り立つということだと思われる。
従って、そうであると、効率性を度外視したプログラムがたまに出現し得るので、
それを考慮するために色々作りました、とそういうことをいっているのだと思われる。
912905:03/06/08 15:49
>>911
ありがとう。
shouldとmeanが巧く読めなくて適当に書いた(で、少し虚勢を張ってみた)んですけど、ずばりそこを間違えていたのね。
訳に関してだけでなく、自分の知識の為にも、とても参考になりました。

直訳の範囲を逸脱するなら、ちゃんと知っている人が書かないとやっぱり駄目ですね。
重要な所への配慮が欠けてしまいます
letとletrecがSchemeにはあるんだが。
で?
915デフォルトの名無しさん:03/06/23 01:23
C++でいう静的メンバ変数はOCamlではどのようにすればつかえるのでしょうか。
マニュアルを見てもわかりませんでした。
見落としているだけかな・・・。
>>806≡913
コピペ?
静的メンバ変数は使えないかも。
逃げの一手。
let x = ref 10;;
class c =
object
method get_x = !x
method set_x = fun y -> x := y
end
とか。試してないから合ってるかどうかわかんないけど。
ocaml のクラスはようしらんけど……

http://caml.inria.fr/ocaml/htmlman/manual005.html

>#class adjusted_point x_init =
> let origin = (x_init / 10) * 10 in
> object
> val mutable x = origin
> method get_x = x
> method get_offset = x - origin
> method move d = x <- x + d
> end;;

とあるから、破壊代入できるような静的メンバ変数が欲しいなら

class c =
let x = ref 10 in
object
method get_x = !x
method set_x = fun y -> x := y
end

などとするほうがよいかと。外から隠せるし。

ところで破壊代入ってどうなんですかね。

関数型とオブジェクト指向と破壊代入って
そのうち任意の 2 つはそこそこ相性がいいと思うんだけど
3 つ揃うとどうかなぁと思うことが何度かあるです
みなさんどう思いますか?
919915:03/06/24 00:56
O'Reilly本の英訳版の中に「Class Variables」という項目を発見しました。
それによると>>918のようにやっているみたいです。
>>918のように書くとてっきりインスタンスごとに値が用意されちゃって
ふつうのメンバ変数のようなものになるのかと思っていました。
どうもまだ基本的なところがわかっていないようです。

ありがとうございました。 >917,918
   F#相談室   
http://pc2.2ch.net/test/read.cgi/tech/1054523453/

こんなスレできてたんですね。
次スレに使うとか >>903
>>920
いやです。
F# の話題に限定してはいけない。ここは ML スレだ。
OCaml も SML もありなのだ。
O'Caml で質問です。

let rec foo_a n f a =
if n=0
then a
else foo_a (n-1) f (f a)

let foo_b n f a =
let rec iter n a =
if n=0
then a
else iter (n-1) (f a) in
iter n a

foo_b より foo_a の方が速いのなぜですか。
もっといい書き方はありますか。
>>922
x86 の話だけど。
foo_a の中で f を呼ぶ時はオーバヘッドがかからないのだけど
foo_b の中で f を呼ぶ時はオーバヘッドがかかっている。

以下をみれば自明。

Tmp__iter_64:
subl $8, %esp
(中略)
.L100:
movl %eax, 0(%esp)
movl %ecx, 4(%esp)
movl 12(%ecx), %edx
movl (%edx), %ecx
movl %ebx, %eax
movl %edx, %ebx
call *%ecx
(以下略)
mp__f1_56:
subl $8, %esp
(中略)
.L103:
movl %eax, 0(%esp)
movl %ebx, 4(%esp)
movl (%ebx), %edx
movl %ecx, %eax
call *%edx
(以下略)
ICFPはどうですたか
smlで
fun rev [] = []
| rev list = rev (tl list) @ [hd list];
と定義して、
- rev [];
とするとこうなるのですが、どうすればいいのでしょうか。
stdIn:66.1-66.7 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val it = [] : ?.X1 list
O'Caml をオキャメルと呼ぶか、オキャメと呼ぼうか。
この際、キャメルと呼んでしまおうか。
おーきゃめる
志村に対抗して岡村
話の流れをブッた切って申し訳ないんですが,みなさんどんな環境で使ってますか?
当方Macでsml/njにて弄ばれていますが,mi(テキストエディタ)とterminal行ったり来たりでは
どうも使いにくい.emacsにsml-mode入れても,なんとなくしっくり来ないし.
Smalltalkのbrowserみたいなの(teikadeみたいなのでもエエや)があれば便利なんだけどなぁと無い物ねだりしてます……
>>929
Emacs+sml-modeです。インデントがよくわかりません。
931山崎 渉:03/07/15 10:34

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
933山崎 渉:03/07/15 14:09

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
934929:03/07/15 16:34
>>930
とりあえず,sml-modeでやってます.いろいろいじったら,そこそこ見やすくなった.
>>932
これがMacで走ればねぇ(エミュ不可).
935デフォルトの名無しさん:03/07/15 20:41
擬似乱数使いたいんですけど、
擬似乱数の使い方は試行錯誤でなんとかなったものの、
(擬似乱数の初期化用の)現在の時間の取得方法が分かりませんでした。
どうやればいいんでしょうか?
936デフォルトの名無しさん:03/07/15 20:41
コギャル・OL・人妻たちのもろ画像がたくさん見れる!!
http://www3.free-city.net/home/espresso/princess/peach.html
>>935
Time.now ();
のことかな。
938デフォルトの名無しさん:03/07/15 22:33
Random.self_init ()
939デフォルトの名無しさん:03/07/15 23:10
>>937
うちのには Time モジュールってのは無いようです。
Objective Caml version 3.06 なんですけどね...。

>>938
それでいけました!
self_init...そんな関数名、思いつかんわけだ。

ありがとうございました。
940デフォルトの名無しさん:03/07/15 23:12
>>939
リファレンス見れば載ってるでしょ?
941デフォルトの名無しさん:03/07/15 23:23
>>940
http://caml.inria.fr/ocaml/htmlman/index.html
発見。これですか。
http://caml.inria.fr/ocaml/htmlman/libref/Random.html
なるほど。Random.self_init も載ってますね(当たり前だ)。
今から DL して家宝にします。
942デフォルトの名無しさん:03/07/18 12:34
そろそろ次スレ。>>950 が立てる。
関数型プログラミング言語のメーリングリストのスレかと思った。
944デフォルトの名無しさん:03/07/18 14:42
プログラミングMLと定理証明システムはもうなんの関係もないんですか?
>>944
今でもMLで開発されてるんじゃないの?
MLで書かれた定理証明系の教科書も出てたと聞いた様な。
COQ とか OCaml で書かれてますが
947デフォルトの名無しさん:03/07/18 23:04
OCaml なら ML の派生言語なのでギリギリ OK 。
>>946
定理証明システムという名のソフトウェアは
何で書かれているのかが問題となるようなものなんですか?
そんなことは無いでしょう。
>>948
話の流れをよくよみましょう ;-p
>>949
僕も >>944 以降の話の流れがよくわかりません。
教えてください。
このスレを“定理証明”で検索すると、>>586-592 あたりが
ヒットしますが、関係ありません?
>>951
ありがとうございます。関係あります。
過去ログ読んで、自分なりに少し考えてから出直してきます。
953デフォルトの名無しさん:03/07/20 01:06
新スレ立ってから10日たつが、まだ10しかレスつかない。どーする?
955デフォルトの名無しさん:03/07/30 14:06
どーするとか言われても
>>955
>>954は削除人
957山崎 渉:03/08/02 02:11
(^^)
958デフォルトの名無しさん:03/08/07 17:39
OCamlとStandard MLってどれぐらい違うんですか。
Standard MLを大堀先生の本で12章ぐらい(ストラクチャとかモジュール)
まで勉強したんですが、OCamlの方が評判よさそうなので
、そんなに差がないなら乗り換えようかと。
乗り換えましょう乗り換えましょう
960デフォルトの名無しさん:03/08/07 23:27
差があるから乗り換えましょう
961デフォルトの名無しさん:03/08/07 23:29
コスプレ度NO1。ケンタッキーのバイト娘です。
制服着用のままフェラ、本番をこなしてくれます。
性格の非常にいい子で撮影者のなすがままです。
テレクラでキャッチしたようですがこんないい子がいるのならいってみようかなー。
http://www.geisyagirl.com/
962929:03/08/08 13:48
>>960
sml/nlに対するOCamlの利点は?
963デフォルトの名無しさん:03/08/13 19:32
age
http://ocaml.jp/
のOJUGってOcaml Japan User Groupの略なの?
Cの初心者本にスピードアップの手段として、
変数、関数にできるだけchar、intを使い、floatなどをさける。
と書いてあるんだけど、ocamlでも

# float_of_int(3) +. 3,4;;
- : float = 6.4

とするよりも

# 3 + int_of_float(3.4);;
- : int = 6

としたほうがいいの?

後者のほうが+の後に点をつけなくてすむから楽だし
それで実行速度があげればいいんだけど。どうだろうか。
966デフォルトの名無しさん:03/08/14 19:34
>>965
計ってみれば?
どやって?
>>965
その 2 つのコード、返す値が int と float で異なるけどいいの?
なにをしたいのかよくわかんない。

とりあえず cygwin port の ocaml インタプリタで以下のコードをそれぞれ 10000000 回走らせて大体の時間を計ってみました。

float_of_int(3) +. 3,4 -- 4.0 秒
3 + int_of_float(3.4) -- 3.4 秒
float_of_int (3 + int_of_float(3.4)) -- 4.7 秒 (参考)

つまり (結果的には) 後者の方が速いってことですね。
ただし C の場合で float より char, int を使ったほうが速くなるというのとは、
速くなる理由がやや違って、ocaml ではガベージコレクタが int を特別扱いしているためかなと思います。

蛇足。ocaml の float は C でいう double の精度を持ってますよ。
>>968
俺のためにありがとう。
じゃあ、ここ↓のネイティブコードってどうやって使うんですか?
http://caml.inria.fr/oreilly-book/html/book-ora068.html

ocamlcでコンパイルしたらexeファイルが出来上がるので使えるのですが
ocamloptだと.cmiファイルと.cmxファイルしかできません。
970山崎 渉:03/08/15 15:23
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
971デフォルトの名無しさん:03/08/15 18:40
CからML使うメリットって何?
一行目に #!/usr/local/bin/ocaml と書いてある test.ml があって、
./test.ml で実行できるのですが
#!/bin/sh
./test.ml
というスクリプトが実行できません(test.ml が sh として実行されているようです)。
明示的に /usr/local/bin/ocaml test.ml と書けば問題無いのですが、どうすれば上のスクリプト
を実行できるでしょうか。ocaml を cgi として使いたいです。
>>972
一番簡単なのは test.ml をコンパイルしてしまうことです。それなら
動きますよ、多分。その方が早いし。

シェルスクリプトになってしまう理由は謎。だれか教えてプリーズ。
こっちの環境では ./test.ml で実行しようとしても sh として
実行されてしまった。
strace ./test.ml とすると、execve で Exec format error と
言われてこけてしまっているみたい。分かったのはそれだけ。
>>973
コンパイルしたら動くんですけど、めんどくさいんですよね。
sh でも csh でも tcsh でも ./test.ml だとシェルスクリプト
として実行されてしまいました。zsh が例外のようです。
解決しました。
ocamlmktop -custom -o mocaml
して mocaml 使えばよいみたいです。
976デフォルトの名無しさん:03/08/20 20:58
shell$ cat hello.mls
#!/bin/sh
# (*
exec ocaml "$0" "$@"
*)
load "stdlib.cma";;

print_string "Hello, world!\n";;
shell$ chmod a+x hello.mls
shell$ ./hello.mls
Hello, world!
shell$

ocamlfind(findlib, topfind)を使うなら
shell$ cat hello2.mls
#!/bin/sh
# (*
exec ocaml "$0" "$@"
*)
use "ocamlfind";;
#require "stdlib";;

print_string "Hello, world!\n"
shell$

ocamlfindを使えば依存関係も-I指定もいらないので楽。
おまえ達へ。
初心者の俺が聞いてやるので教えてください。
Autoexec.batへの環境設定で

set path=d:\ocaml\bin
set ocamllib=d:\ocaml\lib

とすればいいのですか?
ocamlでosはかけるのか?
prolog で os を書こうとしたことがあるぐらいだから
OCaml でもかけるでしょう。prolog で OS は、prolog machine の上で、
ですが。

ただ、メモリ管理が問題になりそう。それさえ適当にクリアすれば書ける。
そしてそれは十分にクリア可能。

昔 Lisp Machine というものがあったけど ML machine とか作らない
かなー。10年先は C じゃなく ML が標準になっていることを望む。
OCaml の勉強をしようと思って、手始めに↓をOCamlに翻訳しようと思っていきなり挫折w

ttp://www.miv.t.u-tokyo.ac.jp/~yabuki/tip/lisp/unknowable/godel.html

どなたか知恵を与えていただけないでせうか
981デフォルトの名無しさん:03/09/06 10:48
>> 978こんなのがあるらしい。動かした事ないが。ttp://mynos.sourceforge.net/ちょっと見た感じだとbyte codeで動作してるようだが。
982981
うへ、エンコード間違えた。
改行されてなくてゴメソ