トップページ⇒tech
976コメント334KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
関数型言語ML(SML/Caml/Ocamlなど)についてのスレッドです。
MLは比較的学びやすく、関数型言語を学んでみたい人にもお奨めです。

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


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

サンキューでした。
0233コメントNGNG
(*_*)
0234ageNGNG
>>233
(*'ー`*)
0235213NGNG
まだ、マニュアルをちょっと読んだだけだけど、
Ocamlってかなり強力な言語みたい。SML以上かな。
0236デフォルトの名無しさんNGNG
>>235
その上にMLより速いです。
GUIも作れるようだし。
0237デフォルトの名無しさんNGNG
これって何?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.
0238デフォルトの名無しさんNGNG
原文はここ
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つを供給しなければなりません。
0239238NGNG
原文へのリンクに「>>237」が余分に付いていました。注意。
0240デフォルトの名無しさんNGNG
じゃあ、安心してソースを見せない商用ソフトとか、
書きまくって良いのでしょうか?

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

#入らぬ心配だとは言うな(笑
0241gggggggg ◆gggggggg NGNG
hima
0242grrrrrrrrrNGNG
ima ? http://www.imahima.com/index.jsp
0243デフォルトの名無しさんNGNG
http://www.kde.gr.jp/document/qpl.html
QPLの日本語訳です。
0244デフォルトの名無しさんNGNG
>>243
GPLじゃないらしい
0245デフォルトの名無しさんNGNG
どなたか頭のいい人、
Ocamlのライセンスの疑惑を解決してください。

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

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

あと、標準ライブラリにも一部ライセンスが違うものが含まれている
かもしれないことに注意(別ライセンスの C のライブラリを使ってた
りするらしい。Str モジュールとかだったかな)
0247238NGNG
処理系の改変時にはパッチなどの形式で配布しなければならないようです。
http://www.gnu.org/philosophy/license-list.ja.html のQPLのところを参照。
その辺訂正。
0248213NGNG
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);;
0249デフォルトの名無しさんNGNG
OCamlモード追加しておきましたよ。
こんなんでいいのかな?
0250デフォルトの名無しさんNGNG
「数学基礎論へのいざない」倉田令二郎著 届きました。
う〜む、独習書としては??です。
シリーズ0巻、、、。
(自然数を)「1から始めるのは素人です」と言っている
タジマ先生が思い浮かびました。
0251デフォルトの名無しさんNGNG
age
0252デフォルトの名無しさんNGNG
http://www.bagley.org/~doug/shootout/lang/ocaml/allsrc.shtml
このページに載っているソースが物凄く汚いと思うんですけど、
Ocamlではこの書き方が普通なんでしょうか?

なんか、萎えるなあ……。
0253デフォルトの名無しさんNGNG
>>248

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

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

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

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

>>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))
0267デフォルトの名無しさんNGNG
>>264
DLLにしてライセンス逃れするわけにはいかないの?
0268248NGNG
>>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


カリー化したものを計測するにはどうすれば?
考え中です。
0269248NGNG
少々かっこ悪いですが。

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ビット機に比べると現在のパソコンは
モンスターマシンですね。
0270顔も名前も出さずに毎月100万円NGNG
    
Future-Web(フューチャーウェブ)登場
なんと10,000円単位の収入    

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

のってなか
0276デフォルトの名無しさんNGNG
>>273は CML を Concurrent ML ではない何かと勘違いしてると思われ。
0277デフォルトの名無しさんNGNG
>>274
そうです。
「無限論の教室」 野矢茂樹 著 講談社現代新書
0278デフォルトの名無しさんNGNG
>>271
Win98のAPIがいいかげんなので切り捨てちゃいました。
ごめんね。
0279デフォルトの名無しさんNGNG
上げようか。

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

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

プログラムはプログラム。型は型。
それ以上でもそれ以下でもないと思う。
0292デフォルトの名無しさんNGNG
ほとんどの証明には間違いがあるということだな。
0293デフォルトの名無しさんNGNG
>>292
どういう意味?
0294デフォルトの名無しさんNGNG
ほとんどのプログラムには間違いがあるということだ
0295デフォルトの名無しさんNGNG
みずほ銀行もねー
0296デフォルトの名無しさんNGNG
>>280は ML 知らないのだろ。
0297デフォルトの名無しさんNGNG
>>296
禿同。
MLの型推論は関数の定義において冗長な型宣言が
不要だというだけだものね。
0298280NGNG
やはりいらないんじゃないか。
0299287NGNG
>>280
だからはじめから型推論は必要だなんていってないってば!
少し便利になるのは >>297 が指摘したとおり。
0300デフォルトの名無しさんNGNG
>>298 >>280
要らないから無くせというのは短絡的過ぎない?

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

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

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

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

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

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

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

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

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

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

よって (a) > (b)

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

終了〜
0329デフォルトの名無しさんNGNG
>>328
> 型推論がいらないと言ってる今までのカキコ
試験の○×問題に採用しようYO!
0330デフォルトの名無しさんNGNG
>>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++で同じこと書いてみて
0331デフォルトの名無しさんNGNG
ML勉強しようと思ってるんですが、関数型言語は
ど素人です。北野さんのHPで勉強は十分でしょうか?
■ このスレッドは過去ログ倉庫に格納されています