5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:02/01/31 11:43
関数型言語ML(SML/Caml/Ocamlなど)についてのスレッドです。
MLは比較的学びやすく、関数型言語を学んでみたい人にもお奨めです。

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


参考:リンク集
http://www.gin.or.jp/users/daikoku/lang/func/ml.htm

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...
インストールに失敗したか?

557 :533: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年ぐらい公式リリースがないような…

560 :デフォルトの名無しさん:02/05/20 02:57
嫌気が差して辞めたんだろ

561 :デフォルトの名無しさん:02/05/20 03:23
ML2000はなかなか萌える仕様だし、
CMLも使った事はないものの、面白そうなのである。

出せ出せだせ〜

562 :デフォルトの名無しさん:02/05/20 12:30
>>561
>>195が「出ない」と言ったのを見た私。
それでもあなたに同意する私。

563 :デフォルトの名無しさん:02/05/23 23:49
SML/NJ 110.40でた。

564 :デフォルトの名無しさん:02/05/27 20:22
http://groups.google.co.jp/groups?hl=ja&lr=&threadm=aef33705.0202150400.661f3f6a%40posting.google.com&rnum=3&prev=/groups%3Fq%3Dml2000%26hl%3Dja%26lr%3D%26scoring%3Dd%26selm%3Daef33705.0202150400.661f3f6a%2540posting.google.com%26rnum%3D3

565 :デフォルトの名無しさん:02/05/27 20:38
えすくーえるも関数型なんでしょ

566 :デフォルトの名無しさん:02/05/27 20:39
ちがうと思う。

567 :デフォルトの名無しさん:02/05/27 21:02
566に反論してくれ↓

568 :デフォルトの名無しさん:02/05/27 22:31
えくすーえるとは?

569 :デフォルトの名無しさん:02/05/27 22:32
えすくーえるか・・・

570 :デフォルトの名無しさん:02/05/28 14:16
Excel
とかいってみるテスト。

571 :デフォルトの名無しさん:02/05/29 00:05
SQL

572 :デフォルトの名無しさん:02/05/29 01:00
SQLはどちらかといえば論理型では?
つか、なんともいえないが。

573 :あげあげ:02/06/05 20:58
http://research.microsoft.com/projects/ilx/index.htm

574 :デフォルトの名無しさん:02/06/05 21:04
humhum、まいくろそふとりさーちが関数言語関係者召喚した理由が見えたよーな気がする。

575 :デフォルトの名無しさん:02/06/05 21:10
来年あたり、プログラマの流行は関数型言語、
再来年あたりのIA64拡張機能の目玉は、関数型言語primitiveの実行効率向上

とか妄想してみる

576 :デフォルトの名無しさん:02/06/06 08:34
妄想だ。確かに妄想だ。>>575

577 :デフォルトの名無しさん:02/06/06 10:27
F#を皮切りに・・・
関数型言語が広まるといいにャ〜

578 :デフォルトの名無しさん:02/06/06 12:31
FIMLってなんだろうな?

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

ジャックさんは日本語が結構得意だったはず。
ああ、日本語のページがほすい。

579 :デフォルトの名無しさん:02/06/06 12:31
FIML
http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/fiml/fiml.html


580 :デフォルトの名無しさん:02/06/14 10:31
F#って動くの?
なんかうまくうごかんかった。

581 :Obj.magic:02/06/14 20:43
test

582 :デフォルトの名無しさん:02/06/17 11:52
質問でございます。

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

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

どなたか親切な方、もしよろしけばれば・・

583 :デフォルトの名無しさん:02/06/26 00:45
ocamlにしよう!
と身も蓋もないことを言ってみるテスト

でも、なぜsmlnj?

584 :デフォルトの名無しさん:02/06/29 13:42
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表示などは
しなくても良いわけですよね?

588 :デフォルトの名無しさん:02/07/02 00:00
>>586
私もよくわからないんだけど、MetaLanguageなのは、定理証明系
を記述した言語という意味じゃなくて、定理証明系において、定理証明
の過程で中間的に用いられる戦略もしくは、証明文そのものを記述する時に
使われた言語という意味なのでは?
おそらく意味論が数学的にきっちり定義されているのだと思う。

589 :デフォルトの名無しさん:02/07/02 00:59

>>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はこんなところかな。

長くてすまん。


590 :589: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」を紙で計
算するところをキーをパチパチうちこんで機械に計算させる。そんな感じで、
黒板の前でうんうんうなるかわりに定理証明系に最初にゴールを入れて、あと
は手でゴールを分解して証明していく。メリットは証明手続きを(ちょっとば
かし)自動化できること、あと人間のケアレスミスを排除できることかな? 電
卓でもそうだよね。

また長かった。逝ってきます。


591 :589: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でやっている
ことをそのまま持ってくるのは無理かなと。

593 :Super 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
;

595 :デフォルトの名無しさん:02/07/12 22:35
NONE = >の所で=と>の間をあけちゃだめなんじゃない?


596 :デフォルトの名無しさん:02/07/12 22:51
あー・・・ホントだ・・・気づかなかった・・・。
ども。お騒がせしました。

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) としたいの?


599 :597: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は何者^^; すごい正確な認識…

169 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)