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

■ このスレッドは過去ログ倉庫に格納されています
2009/06/15(月) 07:15:21
関数型言語MLについて語るスレッドです。

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

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

前スレ
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/
2011/04/17(日) 21:40:45.30
>>402
そのページ印刷して本に挟んどけよ
2011/04/17(日) 22:50:12.49
間違いは無いに越したことはないけれど、
これぐらいの量の間違いは大したことないと思う。
2011/04/17(日) 22:51:29.38
十分大した事あるな
2011/04/18(月) 00:31:01.42
技術書読んだことあんのか?
2011/04/18(月) 08:22:14.27
技術書は静的型付けじゃないからな
2011/04/18(月) 11:08:36.97
コーダとベリファイヤの性能が低い
2011/04/20(水) 18:55:51.89
> 自分は、この人にhaskell版を書いて欲しいぞ

アマゾンで下のレビュー書いた人かいw
410デフォルトの名無しさん
垢版 |
2011/04/20(水) 20:57:40.94
ちょっと困っていることがあるので、助けてください。

ヨウ素がリストの参照になっているようなベクトルを用意して、各要素に
データを追記していくような処理をさせると(具体的には、複数の時系列を記録
したファイルがあって、これを時間順に読む)、追記回数の自乗のオーダの
処理時間が掛る。リストの先頭に追加しているだけなので、線形時間でやって
ほしい。


411デフォルトの名無しさん
垢版 |
2011/04/20(水) 20:58:06.52
(* コード例)
val bigV = Vector.tabulate(1000000, fn _ => ref (nil:int list))
val dat = Vector.tabulate(1000000, fn i => i)

val t0 = Time.now();
val tLast = ref (Time.-(t0,t0));
fun showTime() = let
val tLast' = !tLast
val () = tLast := Time.- (Time.now(), t0)
val dt = Time.-(!tLast, tLast')
in
Time.toString (!tLast)^","^ Time.toString dt
end

fun append k =
(print (Int.toString k ^ "," ^ showTime()^ "\n")
;Vector.app (fn box => box := k :: !box) bigV
)

val () = Vector.app append dat
2011/04/20(水) 21:15:18.30
ヨウ素とかベクレルの話かとオモタ
413sage
垢版 |
2011/04/20(水) 21:46:08.88
辞書(と見逃した自分も)がそっち方向に過学習してしまったらしい。すまん。
2011/04/21(木) 00:19:44.70
自分の環境ではサンプルプログラムの実行に二乗オーダは見られなかった。
bigVの大きさを一桁下げると速度がぐっと変わるし、GCとかのせいな気がする。
2011/04/26(火) 20:50:17.84
SMLの勉強していて思ったけど、最初に学ぶ言語として関数型言語はやはり難しいかも知れない。
C言語だとHello Worldから始まって、リスト処理は構造体とポインタの応用問題という位置づけだった。
SMLはいきなりリストと再帰の話から始まるw

BASICは、LISPよりも後から開発されて、しかも同じダートマス大学発祥だけど、
リスト処理が実装されていないのもそれなりの理由があったのかなと思う。
2011/04/26(火) 21:56:29.55
奥さん、そこで Factorですよ。
2011/04/26(火) 22:12:07.58
>>415
> BASICは、LISPよりも後から開発されて、しかも同じダートマス大学発祥だけど、
> リスト処理が実装されていないのもそれなりの理由があったのかなと思う。

LISPとBASICじゃ作られた目的が全然違う
それに当時の計算機の性能ではリスト処理は時間的にもメモリ的にも大変重い処理だった
今の感覚や価値観は60年代の計算機や言語・ソフトの評価や判断には全く通用しない
2011/04/27(水) 00:17:49.66
最初は易しい言語で、ってことが重要に思えるところ、
その信念に基づいた妄想を長々と書きこむところ、
これはその人の性質をよく表していると思う。
こういうひとのためにも緩い言語は必要。
ML系はそういうのとは全然違う。
419デフォルトの名無しさん
垢版 |
2011/04/27(水) 14:00:52.81
>> 415
ポインタ+構造体+慎重な操作を免除して、いきなりリストが使えるのが
売りだと思うのだけれど。

また、MLは破壊的代入+whileループが特別な儀式をしなくても使えるの
で、再帰を学ばなくてもある程度は使える。

2011/05/18(水) 01:03:29.10
眉間のτとλ皺が特徴。
                            やつを追う前に言っておくッ!
                    おれは今やつのStateTをほんのちょっぴりだが体験した
                  い…いや…体験したというよりはまったく理解を超えていたのだが……
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれは奴の前で階層を lift していたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにか lift が消えていた』
        |リ u' τ ,ノ _,!V,ハ |
       /´fト、_{λ{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  ∀:::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    キャストだとかサブタイピングだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…
2011/06/08(水) 22:38:54.29
保守
422デフォルトの名無しさん
垢版 |
2011/06/20(月) 02:35:53.95
Ocamlとか関数型言語とか難しいことはよくわからないが
ターミナルでTwitterクライアントが動くらしいので
Ocamltterに手を出してみる。
そういえば親父がLISP好きだったのを思い出す。
2011/06/20(月) 02:43:18.06
フランス人と日本人って意外に共通点があるよな
2011/06/20(月) 02:48:34.90
皇女様をギロチンにかけたりな
425デフォルトの名無しさん
垢版 |
2011/06/20(月) 07:42:00.20
OcamltterあきらめてOcaml入門やってるんだが再起呼び出しとかちょっと難しいな。
for文と違う。

数学者にやらせると面白いことになりそうな謎のワクワク感を感じる言語ではある。
2011/06/30(木) 22:40:46.75
みんな Haskell に移行してしまったんかいなぁ
2011/07/05(火) 04:45:54.85
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな


ゴミの分際でw
428デフォルトの名無しさん
垢版 |
2011/07/05(火) 11:37:20.29
>>427
科学計算を主に念頭においてるものだったら、Python一択になってくるよ。
それだけライブラリが充実している。scipy,numpy,matplotlib,mayaviなんて
のがあるからね。

>>415
手続き脳から見れば当然難しいけど、数学の漸化式を知ってれば再帰は
馴染みやすいし問題ないよ。難しくしてるのは頭の中で無理やり手続き型
に想定して理解しようとする癖があるからだよ。手続き型に染まった連中が
苦労するのはその悪癖が抜けないから。
リストとか関数の取り扱い(Cでいうと関数ポインタだな。)は手続きにとって
みれば高嶺の花だけど、そこが一番簡単にさせている要因なんだよね。
手続きに染まった人ってただ頭が硬直しただけなんだよ。
2011/07/05(火) 11:40:45.99
ファーストクラスの関数を、関数ポインタのようなもの、とかいうのは、
誤解を招くだけでないかな。
2011/07/05(火) 12:09:28.96
>>429
じゃあどう簡潔に言えばいいか示してくれ。それだけでいいよ。
2011/07/05(火) 12:14:26.97
「ファーストクラスの関数」
2011/07/05(火) 12:20:26.45
>>431
手続き脳の人相手に話をする場合、それで通じれば問題がないけど
彼らの試行の中で比較的近いものを取り上げて説明しようとしないと
たぶん、言葉が通じないと思うよ。CS専攻の連中相手に話をするならば
それで問題はないよ。もし知らなければ不勉強だってことだからさ。
433デフォルトの名無しさん
垢版 |
2011/07/05(火) 19:57:30.54
環境をキャプチャした関数ポインタのようなもの?
2011/07/05(火) 20:12:36.48
それはもうポインタでも何でもねぇw

クロージャは、下手にCの概念で説明するよりは、定義をしっかり伝えたほうが、
相手に伝わりやすい代表例じゃないかな。モナドとか継続とかと一緒で。
2011/07/05(火) 20:37:31.44
一応Cでもgcc拡張ならクロージャはある
C++ユーザならC++用語で言うファンクタ(関数オブジェクト)を結構使うはずなので、
ただの関数ポインタとの違いはわかっていると思う
クロージャが近いのは勿論ファンクタのほうだけど、C++のようにいちいち
classやstructでそれを記述する必要がない
もっともC++のそれがあまりに面倒くさかったので、C++でも0xでついにlambdaが
導入されたわけだけど
2011/07/07(木) 11:04:09.84
他のスレでやれ
2011/07/07(木) 13:02:54.88
>>427
誤爆?
438デフォルトの名無しさん
垢版 |
2011/07/09(土) 19:06:45.30
>>435
>一応Cでもgcc拡張ならクロージャはある

nested function の事なら、内部関数から参照している変数のスコープの
外からは使えないのでクローズしているとは言えないんじゃないかな。

http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

C なら Blocks を使う方が良さそう。
439デフォルトの名無しさん
垢版 |
2011/07/12(火) 19:45:27.51
>>438
そこを読むとinner functionのアドレスを取れると書いてあるけど、
upward funarg problemを解決しているわけではないの?
2011/07/12(火) 20:32:45.49
>>439
環境を保存しておいてくれる訳じゃないからね
441デフォルトの名無しさん
垢版 |
2011/07/12(火) 22:06:56.99
>>440 なるほど。危険ではあるが役に立つかも知れないから機能は提供する
ということか。
2011/07/30(土) 19:06:44.85
OCamlにしようか、それともHaskellにしようか迷ってます。
こういう用途ならこっちのほうがいいとか、なんかアドバイスお願いします。
2011/07/30(土) 19:45:47.15
>>442
では、用途を教えてくだしあ
2011/07/30(土) 20:08:56.47
>>443
こーいうやつはプログラミングの勉強自体が目的だろ。
2011/07/30(土) 20:16:25.35
>>444
プログラミングの勉強自体が目的ならhaskell一択
2011/07/30(土) 20:42:08.59
>>444
はい、その通りです。
PHPとJavaとJavaScriptはある程度書けますが、関数型言語をなにかひとつみにつけようと思います。

>>445
よろしければ理由を教えてください。
ぐぐった感じでは、haskellはモナドというのが難しくて多くの人が挫折しているようので、OCamlに傾いてます。
2011/07/30(土) 20:52:58.37
>>446
勉強ってことだし、関数な考え方を得ようってなら純粋なHaskellの方を推奨
448デフォルトの名無しさん
垢版 |
2011/07/30(土) 20:54:22.93
勉強自体が目的ならなんで両方やらないのっていう
2011/07/30(土) 20:56:02.64
あと入門用に、英語読めるなら、比較的平易な英文で書いてある

http://learnyouahaskell.com/

を挙げておきます。下の方にあるonlineを選ぶと、売っているものに近い内容が読めますよ。
2011/07/30(土) 21:05:00.48
OCamlの入門書が1冊、Haskellの入門書が数冊出てるからどれか1つ、
とりあえず借りるか買うかして、それぞれ第1章ぐらいやってみなさい。
2011/07/30(土) 21:05:33.97
>>446
関数型言語の特徴が余す事なく取り入れられてる
モナドは使う分には難しくない
使う分にはシンプル イズ ベストな書き方がやり易い言語

モナドを分からないと使えるようにならないと勘違いして脱落する人多いけど、モナドの理論的背景を理解する必要は無い
気になるなら気長に勉強しなされ

OCamlはループも有るし、副作用対策諦めてるし、手続き型言語に限りなく近い関数型言語って感じ

速いコード吐けるけど、昨今の関数型言語の特徴取り入れた手続き型言語が多い時代に勉強する意味は薄い
2011/07/30(土) 21:07:10.73
手続きばっかだっし、古典のschemeでいいんじゃねーの?
2011/07/30(土) 21:10:08.69
Lisp族はLisp族で悪くないけど、関数型プログラミングを今時勉強するならその選択はない。
2011/07/30(土) 21:16:22.99
>>452
カリー分と遅延評価がデフォルトで付いてない
自分で同じ事を再現とかは出来るけど、それじゃ関数型言語の学習とは違う
2011/07/30(土) 21:20:58.25
>>449
haskellスレで翻訳中って聞いたぞ
あと、kindleでサンプル読んだ限りじゃプログラミングhaskellの内容を砕けた言葉とイラストで書いてるだけに見える
内容的にはすでに翻訳されてるプログラミングhaskellで十分
2011/07/30(土) 21:28:52.08
みなさん、ありがとうございます。
OCamlスレなのにHaskell勧める人ばかりなので、OCamlに未練はあるけど、思い切ってHaskellやってみようと思います。
2011/07/30(土) 21:34:22.91
>>456
いや。。。
haskellもMLの子孫なんだが。。。
2011/07/30(土) 21:36:14.27
>>456
俺はHaskell→OCamlと来た。
どっち先でもいいし、両方やればいいんじゃないだろうか。
片方しかやっちゃいけない決まりはないんだし。
面白いことは何でもやるべきだよ。
ミニ四駆だって、マグナムセイバーを買う傍ら、ソニックセイバーも買っただろ。それと同じ。
2011/07/30(土) 22:15:41.84
そんなことはどうでもいい。OCamlのサイトが404だ。
http://caml.inria.fr/ocaml
2011/07/30(土) 23:17:43.26
げ、ほんとだ
2011/07/30(土) 23:23:32.07
すごいタイミング
>>456にはOCamlと縁が無かったんだな。。。
2011/07/30(土) 23:29:26.27
ついにオワコンか
2011/07/30(土) 23:50:18.39
OCamlがOCamlとして生まれ変わった際のゴタゴタだそうだよ
2011/07/31(日) 21:38:50.21
http://twitter.com/#!/camlspotter/status/97519093602717696
>描いたのは俺!
>RT @y_echo
>RT @kinaba: なにがあったのwww
>RT @kikx これは変わりすぎだろ!
>RT @yoshihiro503 ちょ、 OCaml のサイトが激しくイメチェンしてる caml.inria.fr
2011/08/01(月) 08:56:35.19
OCamlってもう手に入らないん?
2011/08/01(月) 10:15:28.29
>>465
http://twitter.com/#!/camlspotter/status/97683309177475073
>一つだけ皆さんに言っておきます。毎年この時期には OCaml には何かが起きます。
>それはリア充関係者がバカンスに行ってしまって連絡が取れなくなるからです。
> RT @ytomino ocamlがついに滅んだと聞いて(遅い
http://twitter.com/#!/camlspotter/status/97685810127716353
>てか週末にサーバ不調になったら48時間止まるのあたりまえやろ?人間として。
http://twitter.com/#!/camlspotter/status/97686190618181632
>と haskell.org が落ちたときには wktk してた人が言っても説得力ありませんな

とりあえずフランスの月曜日昼(日本時間21時ごろ)まで待ちましょう。
それまでに復旧しなければ長期化確定ですね。
2011/08/01(月) 10:34:00.78
http://proofcafe.co.cc/ocaml/
468デフォルトの名無しさん
垢版 |
2011/08/01(月) 22:02:08.55
>>466
直らんね。もうしばらく待つか。
2011/08/01(月) 22:10:14.76
復活したね
2011/08/02(火) 18:02:01.87
Lisp族はいいぞ。でもclojureを触っているとhaskellの影響がかなり大きい。

ocamlも触ってみたいけど、いまHaskell勉強中なんだ。たぶん、来年くらいには
やれればな。HaskellってLispと同じでプログラム作成までの抽象化も含めた
戦略を練るのに時間がかかる言語って感じがしました。Ocamlも同じなんだろうね。
2011/08/02(火) 20:08:11.41
haskellはデータ構造を作るプログラミングになるって、山本和彦さんが言ってた
2011/08/02(火) 20:23:02.98
>>470
Haskell影響は並列周りでしょ。
そもそもSTMはHaskell由来じゃないし。
他はもろLisp直系じゃん。
2011/08/02(火) 21:58:52.67
>>472
見た目だけで話してるでしょ?
実際に触ってみればわかるけど、無限ストリーム近辺の関数はHaskellと
かなり近いよ。takeとかその辺のことね。common lispでも自作する方法は
あってもこの手の物は標準でないしね。
だから、リストの取り扱いってがhaskellに近くなってる。
>>471
なるほど
2011/08/02(火) 23:33:03.74
takeはHaskell以前からある。
2011/08/03(水) 02:04:20.65
>>472
> そもそもSTMはHaskell由来じゃないし。

でも中興の祖はHaskellの人(Tim Harris)じゃないっけ?
2011/08/03(水) 02:21:43.19
それはそう。Monadの経験が役に立った。
2011/08/03(水) 09:37:38.27
>>474
ミランダとかなの?よくしらないけど(wikiでちょっと見たけど、
haskellの親玉っぽかった。)
それはともかく、Clojureが関数型の大きな影響をかんじるのは
イミュータブルなところかも。あれのお陰で、副作用をもたせようと
思ったら基本的にSTMの部分を活用しなきゃならない。(java固有の
ライブラリは例外的なんだけど。)それと遅延評価言語だって
ところがcommon lisp を触ってる時よりhaskellの影響を感じやすいのかも。
あとは内包表記かな。wikiにはlisp,ML, haskell erlangが影響を受けた言語
とかかれている。
478デフォルトの名無しさん
垢版 |
2011/08/19(金) 10:50:16.31
R診たいなことが全部できるMLないのかよ。
2011/09/19(月) 21:56:29.91
卒業研究でOCamlのライブラリ作ってます。
おもしろいことありますでしょうか?
2011/09/19(月) 23:59:49.52
SML#の新verがひっそり出てた
2011/09/24(土) 23:23:23.61
>>479
どんなライブラリでしょうか?
2011/09/25(日) 11:44:54.04
>>479
どんなライブラリをつくったら面白いでしょうか?
なのか
ライブラリを作ることはテーマとして面白味があるでしょうか?
なのか。
2011/09/27(火) 20:28:58.48
^^;
2011/09/27(火) 20:52:03.96
OpenFlow コントローラのライブラリなどはいかが?
比較的、ホットなトピックだと思うけど。

http://www.google.co.jp/search?q=functional+reactive+programming+openflow
2011/09/29(木) 14:23:07.44
MLの型推論の部分だけ「俺言語」の中に取り込みたい
型推論の部分だけ分かりやすくコンパクトにまとめられたコードどこかにないでしょうか
2011/09/29(木) 15:11:00.44
>>485
http://en.wikipedia.org/wiki/Hindley%E2%80%93Milner
2011/09/29(木) 15:56:30.36
>>485
このテキストの17章
http://www.scala-lang.org/docu/files/ScalaByExample.pdf
タイガー本の16章
http://www.cs.princeton.edu/~appel/modern/ml/
488365
垢版 |
2011/09/29(木) 18:07:57.87
>>485
Prolog で型チェック:Rainy Day Codings:So-net blog
 http://rainyday.blog.so-net.ne.jp/2008-06-16

題名は型チェックだけど、コードはまぎれもなく型推論
2011/09/29(木) 19:09:02.35
ああPrologだから単一化で型推論が起きるのか。
2011/10/04(火) 18:43:07.61
prologで型推定が一番楽にできそう
しかし返値しか推定してないね
2011/10/06(木) 15:33:53.10
SMLやろうと思うんだけど、関数書いたファイルはどこ入れときゃいいの?
2011/10/06(木) 19:31:29.68
WinにもOCaml3.12.1きてるー
ttp://gallium.inria.fr/~protzenk/caml-installer.html
493sage
垢版 |
2011/10/06(木) 20:07:16.49
>>492
SML/NJの場合だと、適当なファイル(例えばhoge.sml)に保存して、保存した
フォルダでNJの対話環境を起動して、
use "hoge.sml"
とすればよい。useはカレントディレクトリからソースを読み込む関数で、
カレントディレクトリの取得/変更は、
OS.FileSys.getDirとOS.FileSys.chDirでできる。




2011/10/06(木) 21:24:34.13
>>493
ありがとう!
2011/10/11(火) 22:10:01.73
http://queue.acm.org/detail.cfm?id=2038036

これみるとC#とかやってられんな
2011/10/13(木) 22:44:28.70
型推論があるから簡潔になるのか
パターンマッチがあるから簡潔になるのか
2011/10/13(木) 22:47:43.98
両方
2011/10/13(木) 23:19:58.73
高階関数とカリー化も簡潔に書くのに一役買ってる
2011/10/14(金) 07:40:42.96
>>495
ひどいよな。C#じゃ複雑なデータ構造を扱おうなんてすると沼じゃないか!
今Haskellの勉強をしててOcamlは読んだことはなかったんだけど
読めるもんだなとも思った。
2011/10/14(金) 07:48:35.09
The C# code, while functionally equivalent, looks cluttered,
with the real structure obscured by syntactic noise.

事実だけど、辛辣だな。
2011/10/14(金) 11:38:18.36
>>499
関数型言語群はMLの影響が強いからね。
C言語系という言い方では、ML系と言ってしまってもいい。
2011/10/14(金) 21:38:01.24
>>501
なるほど、ML系かぁ。そういわれれば納得です。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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