関数型言語ML(SML, OC ..
301:デフォルトの名無しさん
08/04/24 23:49:18
ちゃんと書いとこう。今Ocamlの処理系ないから部分的にF#で試したコードだけども。
List.iter (fun x -> print_endline (string_of_int x)) (1 *.. 10)
302:デフォルトの名無しさん
08/04/25 00:35:19
書籍の質問いいですか?
プログラミングinOcaml(初版1刷)を読んでるんですが
P65のNewton-Raphson法のとこでベージ下部の式変形が
y = f'(x_i) * x - {f'(x_i) * x_i - f(x_i)}
x軸と交わる点がx_i+1なのでy=0としてxについて解くと
x_i+1 = x_i - {f(x_i)/f'(x_i)} * x_i が得られます
となってるんですが
x_i+1 = x_i - {f(x_i)/f'(x_i)} じゃないですかね?
303:デフォルトの名無しさん
08/04/25 21:29:32
JavaのThread.sleepみたいな関数を探しています。
OCamlで「n秒待つ」関数みたいなのは、何ですか?
次のようなプログラムを書いています。
let rec loop count =
print_endline (print_int count);
(* ここで1秒待ちたい *)
loop (count + 1)
let main =
loop 0
304:デフォルトの名無しさん
08/04/25 21:41:38
Unix.sleepかThread.delay
305:デフォルトの名無しさん
08/04/25 22:00:51
>>302
とりあえず正誤表にはなかったよ。もっかいコード見直したら?
URLリンク(www.sato.kuis.kyoto-u.ac.jp)
306:デフォルトの名無しさん
08/04/25 22:23:27
>> 304
できました!
どうもありがとうございます!!
307:デフォルトの名無しさん
08/04/26 01:07:52
>>293
ループは再帰のときに引数を変えれば良い。
してifやパターンマッチで止める。
let rec loop i =
if i<0 then () else
(print_int i; loop (i-1));;
代入なくても書けるというのは
lambdaの引数を利用する。
代入がこんな感じなら
let i = 1 in
i + i;;
こう書ける。
(fun i -> i+i) 1;;
308:デフォルトの名無しさん
08/04/27 01:10:46
letの方はそれ代入じゃない
309:デフォルトの名無しさん
08/04/27 08:38:49
refでやればいいのかよう
310:sakura
08/04/27 11:45:53
こうなんというか深夜亀頭から白濁色の液が滲み ぷっつん。
311:デフォルトの名無しさん
08/04/28 00:36:21
>>302
誰がどう見ても誤植です。どうもありがとうございました。
312:デフォルトの名無しさん
08/04/29 16:34:33
HaMLet v1.3.1
URLリンク(www.ps.uni-sb.de)
SML#にも対応
ベンチマーク用のSML実装としての、あるべき姿か
誰ぞ、SML#をNJ、MLtonとベンチしてたもう
313:デフォルトの名無しさん
08/05/03 13:29:42
関数型言語F#をわかりやすく解説した動画とかないの??
314:[Power of Scala]
08/05/03 16:42:43
>>313
関数型言語Scalaの動画
URLリンク(d.hatena.ne.jp)
315:デフォルトの名無しさん
08/05/03 18:03:03
>>314
関数型言語というよりもオブジェクト指向型の印象が強い言語だな。
カリー化すら出来ないし、代数的データ型すらないじゃないか。
関数型言語の特徴というべき代表的な機能が欠如しているのは関数型言語として致命的。
だから、Scalaはオブジェクト指向型言語だ。
316:デフォルトの名無しさん
08/05/03 19:28:52
制限時間関係なくこの人早口っぽいな〜。
317:Objective Caml
08/05/03 20:11:11
>>313
F#じゃないけど
OCamlの動画 - YouTube
URLリンク(www.youtube.com)
318:デフォルトの名無しさん
08/05/04 00:18:19
OCamlをすこしかじってF#にも興味もったんだけど、
F#って.NETのライブラリが使えるのと、オブジェクトが使えないの以外にどんな点がF#と違うの?
文法面はほぼ同じだと聞いたんだけど。
319:デフォルトの名無しさん
08/05/04 00:28:24
F#はHaskell.NET同様その内サポートされなくなるところが違う。
MSの単なるデモンストレーションだから。
320:デフォルトの名無しさん
08/05/04 01:26:50
>>318
データの型が.NET互換になってて、演算子がオーバーロードされる。
例えば +. 演算子はなくなってて実数の足し算でも + 演算子を使う。
クラスは.NETのクラスになるので、クラス定義まわりの文法にだいぶ変更がある。
321:デフォルトの名無しさん
08/05/04 23:20:06
Jane Street Capital謹製のcoreが公開されたね。
Extlibでもcoreでもいいから標準ライブラリに取り込んでくれないかなあ。
322:デフォルトの名無しさん
08/05/05 01:08:14
>>315
いや、あるよ>カリー化&代数的データ型
単に紹介されてないだけ
323:デフォルトの名無しさん
08/05/05 01:13:40
ちゃんと説明するとScalaには代数的データ型そのものは無いけど、
case classという機能をつかってほぼ同等(以上)のことができる。こんな感じ
/* 代数的データ型 */
abstract sealed class Exp
case class Add(a :Exp, b :Exp) extends Exp
case class Num(v :Int) extends Exp
def eval(e :Exp) :Int = e match {//パターンマッチ
case Add(l, r) => eval(l) + eval(r)
case Num(v) => v
}
eval(Add(Num(1), Num(2)))
まあ、MLの代数的データ型の定義に比べて記述が冗長だけど、機能的には
問題ない。
324:デフォルトの名無しさん
08/05/10 10:05:39
>>323
つまりScalaは関数型言語であるっていうこと??
325:デフォルトの名無しさん
08/05/11 22:57:45
>>324
定義によるけど、たぶん言って良いと思う。MLが関数型言語であるというのと
同じ程度には。
326:デフォルトの名無しさん
08/05/12 06:56:30
>>325どうも
327:デフォルトの名無しさん
08/05/12 13:01:46
代数データ型があるかどうかは、関数型かどうかを左右しない。
ただ今時の関数型言語に代数データ型を持っているのが多いというだけ。
328:デフォルトの名無しさん
08/05/12 17:48:27
関数型言語という言葉に明確な定義が無い以上、ある言語が関数型かどうかは
「典型的な関数型言語」にどれくらい似ているかという尺度で測る他無いんじゃね?
329:デフォルトの名無しさん
08/05/12 19:25:20
あなたがそう思うものが関数型言語です。
ただし、他人の同意を得られるとはかぎりません。
330:デフォルトの名無しさん
08/05/12 20:02:47
無意味なレスしてんなよ noob
331:デフォルトの名無しさん
08/05/12 23:17:55
>>319
逆だよ。
F#は製品化が決まって現在仕様の取りまとめ中。
332:デフォルトの名無しさん
08/05/13 08:09:27
>>328
そんなわけないだろw
代数的データ型があるかどうかは、関数型言語かどうかの尺度にはならない。
>>331
あそこは仕様=実装って会社でしょ。
V0.9的な仕様作ってそれでおしまい。
333:デフォルトの名無しさん
08/05/13 09:58:17
もともと仕様と実装が同じ言語から派生した言語に何を求めるのか.
334:デフォルトの名無しさん
08/05/13 14:55:39
>>332
じゃあ、何が尺度になるの?もちろん、代数的データ型*さえあれば*関数型言語
だとは言うつもりは無いけど、関数型言語の定義なんて人によってかなり曖昧な
わけだ。MLとかHaskellとかのまず間違いなく関数型言語だと認定してもらえる言語と
どれだけ同じ機能を持っているかで比較するしか無いんじゃない?
335:デフォルトの名無しさん
08/05/13 16:08:24
プログラムが参照の透明性のある関数だけで構成されていること
でいいんじゃない?
336:デフォルトの名無しさん
08/05/13 16:54:44
stateがないってんじゃ駄目なの?
monadでstateは扱えるけど、
stateがあるわけじゃないよね。
stateがないってことを厳密にいうと、
「ある時にy=f(x)ならば、どんな時でもy=f(x)」ってことでいいのかな?
337:デフォルトの名無しさん
08/05/13 17:17:45
> プログラムが参照の透明性のある関数だけで構成されていること
じゃあ、MLやOCamlはNGじゃん。ref型があるわけだから。
338:デフォルトの名無しさん
08/05/13 17:54:46
>>337
関数だけで構成されていること
でいいんじゃない?
339:デフォルトの名無しさん
08/05/13 20:49:17
>>338
それだとHaskellすらNGだな
340:デフォルトの名無しさん
08/05/13 20:56:34
C++ だって関数型言語なのに!
341:デフォルトの名無しさん
08/05/13 21:44:13
>>340
ないないそれはない
342:デフォルトの名無しさん
08/05/13 21:47:37
それ有名なネタだよ
343:デフォルトの名無しさん
08/05/13 21:49:08
マクロとテンプレートを思いっきり使えば
それらしいコードは書けるかもしれない。
344:デフォルトの名無しさん
08/05/14 07:36:28
omake はええぞ。omake -P を知ったらやめられん。
345:デフォルトの名無しさん
08/05/14 11:58:34
Boost おそるべし
346:デフォルトの名無しさん
08/05/14 19:10:58
でもないw
347:デフォルトの名無しさん
08/05/17 09:53:43
今日職場で出た話題。
以下のOCamlコードが最終行でエラーには
* ならなさそうで、
* でもなりそうで、
* でもやっぱりならない理由と、
この問題の意図を考えなさい。
let id x = x
let unify x y = if true then x else y
let v = id `A
let _ = unify v `B
let _ =
match v with
| `A -> ()
348:デフォルトの名無しさん
08/05/17 10:31:08
なんでエラーになりそうなのかわからない。
349:デフォルトの名無しさん
08/05/17 11:19:41
>| `A -> ()
なんかAAぽい
350:デフォルトの名無しさん
08/05/17 13:48:50
>>349
怒ってため息をついてるね。w
351:デフォルトの名無しさん
08/05/17 15:38:52
標準で関数型プログラミングをサポートする言語=関数型言語じゃね
標準のSTLだけだと関数型プログラミングは厳しいのでC++は入らないと思う
352:デフォルトの名無しさん
08/05/17 17:10:34
Q. 関数型プログラミングとは?
A. 関数型言語が標準でサポートしているプログラミング
353:デフォルトの名無しさん
08/05/17 21:04:26
相互再帰ですか
354:デフォルトの名無しさん
08/05/17 21:44:22
>>353
無限に再帰してて、止まらないわけですね、わかります。
355:デフォルトの名無しさん
08/05/17 22:08:01
再帰なんて簡単だお。
356:デフォルトの名無しさん
08/05/17 22:32:21
>>347
>今日職場で出た話題。
どこの職場ですか?日本ですか?
357:デフォルトの名無しさん
08/05/18 00:30:58
let id x = xと
let v = id `Aと
let _ =
match v with
| `A -> ()
だけみれば`Aと`Aだからエラーにならなそうで
let unify x y = if true then x else y
let _ = unify v `B
もみるとxとyが同じ型じゃないとエラーで`Aと`Bだからエラーになりそう
でも多相バリアントだからエラーにならないみたいな。
なんか問題がわるいな
358:デフォルトの名無しさん
08/05/18 00:32:16
357は>>347へのレス 書き忘れたorz
359:デフォルトの名無しさん
08/05/18 01:16:05
type 'a 関数型言語 =
{ 変数 : 参照透過; 関数 : 高階; 型 : 代数的; } constraint 'a = 多相
360:デフォルトの名無しさん
08/05/18 08:22:31
>>351
個人的にはSTLがどれほど充実しようが、後付けのクロージャが qsort に渡せ
ない時点で除外したい。箱庭の中だけで関数プログラミングをサポートしても、
その言語が関数型とは言い難い。どんな言語でも関数型言語を「実装」する事
は出来るので。
361:デフォルトの名無しさん
08/05/18 12:09:28
std::sort に渡せりゃそれで十分じゃん。
362:デフォルトの名無しさん
08/05/18 16:41:50
qsortのほうがずいぶん遅いしね
363:デフォルトの名無しさん
08/05/18 16:49:38
>>362
プラットフォームによるとqsortの方が団地に早かったりするんですが
どのようなプラットフォームでお仕事をしておいででしょうか?
364:デフォルトの名無しさん
08/05/18 17:12:28
windows。それ、最適化してんの?
365:デフォルトの名無しさん
08/05/18 17:24:49
>>36
qsort() の呼び出しでは関数ポインタの呼び出しが多いから、インラインで置換するコードには負けてしまうと思います。
366:デフォルトの名無しさん
08/05/18 18:25:41
>>363
プラットフォームって、インライン最適化もできない糞コンパイラを使えばって話か?
367:デフォルトの名無しさん
08/05/18 18:46:20
あるいはstd::sortに関数ポインタを渡してるとか
368:デフォルトの名無しさん
08/05/18 20:41:28
おもしろいな。
関数呼び出しコスト以上に速くなる?
369:デフォルトの名無しさん
08/05/19 07:57:36
>>361
qsort はただの例。ライブラリの形で別言語を実装しておいて関数型でございっ
てのが気に入らないってだけ。関数ポインタを要求している所に渡したり、新
しい関数ポインタのインスタンスを実行時に作れないと。
370:デフォルトの名無しさん
08/05/19 08:58:50
> ライブラリの形で別言語を実装しておいて
言語内の機能で実装しているんだぜ?
371:デフォルトの名無しさん
08/05/19 21:49:06
クロージャはファーストクラスじゃないとね
372:デフォルトの名無しさん
08/05/19 22:47:50
>>370
それいうとあらゆる言語が関数型を名乗れるから。
373:デフォルトの名無しさん
08/05/19 23:02:44
>>370
それいったらアセンブラだって関数型だろwww
374:デフォルトの名無しさん
08/05/20 06:52:47
つまらんんこと言っとらんでコード書け。
375:デフォルトの名無しさん
08/05/20 08:27:19
C++のboost:lambdaみたいなのを、
言語の本来の機能で実装できるのってないんじゃねえ?
376:デフォルトの名無しさん
08/05/20 10:04:38
>>375
boost.lambda 見てないんだけど Lisp のマクロ、R6RS のマクロでも無理?
377:デフォルトの名無しさん
08/05/20 11:19:19
関数型は最初からラムダ式があるから必要ないのでは。
zip(list1, list2, _1 + _2) //←こんな感じ。
378:デフォルトの名無しさん
08/05/20 17:44:55
Boostはポリシーによるプログラミングができる
(lambda (lambda (funcname)) (funcname ...))
↑こんなイメージ。これはLISPだったらマクロなしだと実現不可能じゃない?
型システムが閉じてないことが前提だから
OcamlやF#ではこれ、実現不可能だと思う
//ちら裏:自分はBoostが関数型言語やろうと思ったきっかけ
379:デフォルトの名無しさん
08/05/20 17:52:12
>>378
マクロ書けばええやん?
言語本来の機能でっせ、Lisp のマクロは…
380:デフォルトの名無しさん
08/05/20 18:56:16
>>378
>LISPだったらマクロなしだと
その前提が間違い。何の為の S 式だか。
381:デフォルトの名無しさん
08/05/20 22:14:56
すまん、今の流れでマクロなしってのは間違ってるなw
しかし、マクロありでもポリシーによるプログラミングはLISPでは不可能なんじゃね?
ここでS式が出てくるのはなぜ?
静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし
単なるダックタイピングになってしまう
現時点では閉じていない多態かつ静的な言語って
俺が知る限りC++ぐらいしかないけど他にあるのかな
Template Haskellとかどうなんだろ
382:デフォルトの名無しさん
08/05/20 22:19:20
>>381
>ここでS式が出てくるのはなぜ?
興味無いくせに聞くなよ
383:デフォルトの名無しさん
08/05/20 22:26:20
>>381
declare すりゃいい話だし、元気があればコンパイラ書き換えれば OK
型推論でも何でもできるんじゃないか?
384:デフォルトの名無しさん
08/05/20 22:28:55
ああ、コンパイラ作るのか・・その発想はなかったわw
385:デフォルトの名無しさん
08/05/21 21:52:19
>>384
つか, 処理系自体にシンタックスパーサからコンパイラまで含んでて
そいつらを自前の定義に書き換え可能な言語相手に何を戦ってるんだか
386:デフォルトの名無しさん
08/05/21 23:06:06
>>378
すまんが、このコードで何をしてるのか参考までに教えてくれ・・・
>>385
C++に脳を冒されて、そんな言語が存在することを知るよしもないんだろう
387:デフォルトの名無しさん
08/05/22 05:23:56
>>339
いや、セーフだろ
388:デフォルトの名無しさん
08/05/22 07:28:36
職場で出た話題。
O'Caml で、v == v は真なのに v = v は偽な値 v は存在するか。
389:デフォルトの名無しさん
08/05/22 08:16:39
NaN
390:デフォルトの名無しさん
08/05/22 21:55:52
>>375
>静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし
OCamlは型推論で静的な型が付くからC++並にコンパイル時型チェック働くよ
型変換がらみのバグ出づらい分むしろ安全だと思うけど。
(* てかboost:lambdaコンパイル遅すぎ *)
391:デフォルトの名無しさん
08/05/22 23:38:28
>>390
OCAMLだとこれに相当することができない(STLC<U>が定義済みの場合だけOCamlでも可能)
C++では定義済みかどうかは関係なく宣言できる
STLライクなデータに対する探索コード
template <template <typename T> class STLC,typename U,typename R>
bool has_data(STLC<U>&data,const R&value){
typename STLC<U>::iterator it = std::find(data.begin(),data.end(),value);
if(it!=data.end())return true;
else return false;
}
392:デフォルトの名無しさん
08/05/23 00:30:15
begin(data)がイテレータ関数を戻すなら
find(b,v)はdataの型と関係なく定義出来る
(イテレータ関数の型には影響をうける)
クロージャ使えるって忘れてない?
393:デフォルトの名無しさん
08/05/23 01:10:33
>>391
> 宣言できる
「定義できる」かな?
宣言ももちろんできるけど。
394:デフォルトの名無しさん
08/05/23 01:17:03
念のため言っておくけど、上はあくまでどうしてもイテレータ使いたいならの話
リストは、|でパターンマッチして再帰でグルグルが普通
395:デフォルトの名無しさん
08/05/23 01:22:07
要は先に定義が必要だったりはしないので、391は間違ってると思われ
396:デフォルトの名無しさん
08/05/23 01:39:44
>>391の例自体は不適切かもしれんが、C++のテンプレートにできて他の殆どの言語にできないことがあるのは事実だよ
C++のテンプレートの顕著な特徴は
・型検査と名前解決の一部がインスタンス化まで遅延される
・特殊化(テンプレート引数に対するパターンマッチ)ができる
で、メジャーな言語でこれを備えてるのはC++の他にはDくらいしかないはず
397:デフォルトの名無しさん
08/05/23 01:55:42
SFINAE(Substitution Failure Is Not An Error)
URLリンク(en.wikipedia.org)
398:デフォルトの名無しさん
08/05/23 01:59:04
>>396
取り敢えず CL はどっちも出来るな
399:デフォルトの名無しさん
08/05/23 02:06:14
>>398
良く分からん
CLだと引数の型が確定するのは実行時だから、テンプレートみたいなことはやりようが無いんじゃね?
400:デフォルトの名無しさん
08/05/23 02:12:17
GF じゃダメなん?
401:デフォルトの名無しさん
08/05/23 02:17:12
GFって総称関数のこと?
それならやっぱり実行時ディスパッチだからテンプレートとは比較できないだろ
402:デフォルトの名無しさん
08/05/23 04:48:43
>>397
Boostじゃ結構使われてるけど英語しか記事無いのか
403:デフォルトの名無しさん
08/05/23 08:11:36
GFってgeneric functionのことだと思うけど、それだと
>>401の書いてるように、実行時の型に基づくディスパッチだから、
コンパイル時にディスパッチが行われるC++のテンプレートの特殊化
とは全然違うでしょ
404:デフォルトの名無しさん
08/05/23 08:21:47
何で同じ事を2度書く?
405:デフォルトの名無しさん
08/05/23 08:48:42
>>403
packageとcompileで頑張れば、
同じようなものを作れないこともないなあ。
おもしろいかもね。SFINAEはCLOSっぽいね。
まあC++だって総称関数族だから当たり前か。
406:デフォルトの名無しさん
08/06/02 14:56:29
patter match で、
let a = "hoge" in
match a with
a -> "this is hoge"
| "hage" -> "this is hage"
| _ -> "other"
みたいにして、a を "hoge" としてマッチさせることが出来ないのはどうしてなの
407:デフォルトの名無しさん
08/06/02 15:25:34
パタンに変数参照を書けないから。
パタン中に変数書くときは束縛になるじゃん。
408:デフォルトの名無しさん
08/06/02 15:37:05
あ、そうか。束縛と区別できないのか。
ありがとう
でもグローバルに識別子を持っているとき
例えば root_user_name = "hoge" とかあるとして
直接 "hoge" はタイプしたくない場合
match user_name with
eval(root_user_name) -> "root user"
| _ -> "normal user"
とか書きたくなるんだよね
単純なときは if else だけど、複雑なときに書きたくなる
409:デフォルトの名無しさん
08/06/02 19:00:31
つ whenキーワード
410:デフォルトの名無しさん
08/06/02 19:56:37
match user_name with
| user when user=root_user_name -> "this is root user"
| "hage" -> "this is hage"
| _ -> "other"
で合ってる?
411:デフォルトの名無しさん
08/06/02 20:30:39
つ if
412:デフォルトの名無しさん
08/06/03 00:08:07
>409
ありがとー
知らなかった
すげー恥ずかしい
413:デフォルトの名無しさん
08/06/03 02:56:54
>>412
かじりかけじゃしょうがないと思うからがんばれ。
414:デフォルトの名無しさん
08/06/05 08:27:09
パターンマッチにパターンじゃなくて式を書いちゃうのは初心者にはよくあること。
入門書は振れるべきかもわからんね。
415:デフォルトの名無しさん
08/06/05 11:13:11
つ 入門OCaml
416:デフォルトの名無しさん
08/06/05 19:44:14
軸がぶれている
417:デフォルトの名無しさん
08/06/07 10:41:42
質問です、リストの文字を全部つなげるとき
List.fold_left (^) "" ["1"; "2"; "3"]
とか書くとするじゃないですか
でも例えばちょこっと関数を間に挟みたいとき、
let conv x = x ^ "!!" in
List.fold_left (fun a b -> a ^ (conv b)) "" ["1"; "2"; "3"]
とか書くのって違うのかなとか思ってるんですよ
(fun a b ->a ^ (conv b))
の部分をもっとこう関数の合成みたいな感じで短く書く方法ってないですかね
418:デフォルトの名無しさん
08/06/07 12:19:57
十分簡潔に書けていると思う。わかりやすいし。
なぜそんなに短さにこだわる?
419:デフォルトの名無しさん
08/06/07 12:31:55
質問の趣旨とずれているが、そもそも (^) を fold するのはお勧めできない。
文字列コピーが多すぎるから。String.concat とか、 Buffer を使うべし。
上の例は、
String.concat "" (List.map conv ["1"; "2"; "3"])
これで十分だろう。(^) を使うなら417で十分。無理に短く書いて喜ぶ言語ではない。
420:デフォルトの名無しさん
08/06/07 12:36:50
,,,,,,,,,,,,,,,,,,,,,,,,,,
/": : : : : : : : \
/-─-,,,_: : : : : : : : :\
/ '''-,,,: : : : : : : :i
/、 /: : : : : : : : i ________
r-、 ,,,,,,,,,,、 /: : : : : : : : : :i /
L_, , 、 \: : : : : : : : :i / λ抽象したら
/●) (●> |: :__,=-、: / < 負けかなと思ってる
l イ '- |:/ tbノノ \
l ,`-=-'\ `l ι';/ \
ヽトェ-ェェ-:) -r'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヾ=-' / /
____ヽ::::... / ::::|
/ ̄ ::::::::::::::l `─'''' :::|
421:デフォルトの名無しさん
08/06/07 14:08:51
>>417
俺だったら先にmapする
422:デフォルトの名無しさん
08/06/07 14:42:08
俺はconvを2引数にしてこんな感じにするかな
List.fold_left conv "1" ["2"; "3"]
423:デフォルトの名無しさん
08/06/07 21:29:56
ありがとうございました
Buffer は知ってたけど、String.concat は知りませんでした
map 先にやって、String.concat で書くことにします
424:デフォルトの名無しさん
08/06/07 23:34:58
OCamlでファイルIOするときUnix.lseekとかが
file_descr -> int -> seek_command -> int
でintで足りない場合が多々あるかと思うのですが、
皆さんは大きなファイルのIOをするときはどうしてますか?
オフセットの計算とかも Int64.add pos (Int64.mul index 4L)
みたいにしてやってますか?
425:デフォルトの名無しさん
08/06/08 01:20:52
Unix.LargeFile
おまいら、ライブラリ関数で迷ったらまず .mli 読むか、grep するか、
ocamlbrowser でも使えよな。
426:デフォルトの名無しさん
08/06/08 01:34:33
>>425
おお、ありがとうございます!
427:デフォルトの名無しさん
08/06/08 17:22:38
>>424
31bitがだめなら63bitがあるじゃない。
# 0xffffffff;;
- : int = 4294967295
428:デフォルトの名無しさん
08/06/09 00:54:23
>>427
つまらん
429:デフォルトの名無しさん
08/06/12 18:32:15
質問。関数型言語の特徴の一つとしてパターンマッチって出てくるけど何が利点なの?
ifの構文糖衣のようにも思えるけど
430:デフォルトの名無しさん
08/06/12 19:07:00
簡潔に書ける
431:デフォルトの名無しさん
08/06/12 19:48:17
>>429
もしパターンマッチがないとすれば、代数的データ型から値を取り出したい場合はどうする?
たとえばHaskellのMaybe型のJust 3という値から、3という値を取り出したい場合はどうする?
432:デフォルトの名無しさん
08/06/12 20:25:17
それはアクセス関数が自動生成されるようにすれば済む話じゃないか
433:デフォルトの名無しさん
08/06/12 20:39:02
>>429
構文糖には何も利点がないとでも?
434:デフォルトの名無しさん
08/06/12 22:33:33
安全なダウンキャストができることとか?
435:デフォルトの名無しさん
08/06/12 22:41:54
>>434
x + yって中間記法、よく出てくるけど何が利点なの?
(+ x y)の構文糖衣のようにも思えるけど
436:デフォルトの名無しさん
08/06/12 22:42:53
>>432
具体的に実装するとすればどうしますか?
MaybeにはNothingという値もあるんですよ。
437:デフォルトの名無しさん
08/06/12 23:11:58
>>436
入力が不適なら例外発生
438:デフォルトの名無しさん
08/06/12 23:24:50
>>437
Maybeは代数的データ型のひとつの定義に過ぎませんよ。
Just aとNothing以外にHogeという値がある別の定義があったらどうするんですか?
定義はいくらでも作れますよ。
439:デフォルトの名無しさん
08/06/12 23:37:45
>>438
言っている意味が分からん
アクセサの自動生成はHaskellが既にやってること(フィールドラベル使ったときに)だし、技術的な問題はないと思うんだが
440:デフォルトの名無しさん
08/06/13 03:16:09
パターンマッチの利点:
簡潔 - 記述しやすい (accessors (or deconstructors) for free)
安全 - non exhaustiveness check
速度 - 分岐が集約されているので最適化が楽 (ifの繰り返しを解析するのにくらべて)
以上。他にあるかな?
(というか、そもそもパターンマッチは関数型言語の特徴ではありません。
関数型言語が採用しているADTの特徴というべきでしょ。)
441:デフォルトの名無しさん
08/06/13 03:29:17
問題
パターンマッチを採用している手続き型言語を挙げよ
442:デフォルトの名無しさん
08/06/13 05:12:14
awkはパターンマッチなのかな
443:デフォルトの名無しさん
08/06/13 08:15:48
マセマティカ
項書換えシステム全般 (論理型も含む)
444:デフォルトの名無しさん
08/06/13 08:24:46
Scalaはcase classがある。
パターンマッチ渡しはできないが、match case文がある。
URLリンク(www.scala-lang.org)
Extractorはユーザ定義もできる。
URLリンク(www.scala-lang.org)
445:デフォルトの名無しさん
08/06/15 00:12:39
SML#はもう開発止まっちゃったの?
446:デフォルトの名無しさん
08/06/16 13:51:28
F#(OCAML系)があるしなあ。
JNI(Java Native Interface)の中の人は、
SML/NJのWin32対応をやっていた人だった。
Modular Monadic Semanticsの人。
447:デフォルトの名無しさん
08/06/16 17:39:37
メンバがわりと沢山ある構造体(record)がいくつか必要な時は皆さん
メンバの名前が被らないように注意してレコード作ってますか?
それともクラスにしますか?
448:デフォルトの名無しさん
08/06/16 21:15:11
>>446
何か勘違いしていると思われ
449:デフォルトの名無しさん
08/06/16 21:15:42
F#があるのとSML#関係なくね?SML.NETの存在は微妙かも知れんけど
450:デフォルトの名無しさん
08/06/16 21:18:34
>>447
モジュール名で区別でおk
OCamlでオブジェクトの濫用はお勧めできない
451:デフォルトの名無しさん
08/06/16 22:45:23
SML#の「#」は、.NETよりも歴史が長い
452:デフォルトの名無しさん
08/06/16 22:45:43
プロジェクト期間終了したから取りあえず一息つきたいんじゃないの?
O堀さんのことだからこれで終りとは思えないが。
453:デフォルトの名無しさん
08/06/17 03:18:35
>>450
おお、目から鱗ですありがとう!
このスレは勉強になります。。
俺もできるならクラスは使いたくなかったので助かりましたわ。
454:デフォルトの名無しさん
08/06/22 02:24:57
SML♯で,配列 data[](要素数 n)と int型の i,j を引数にとって,
要素 data[i] と data[j] を入れ替えた配列 を出力する関数
ってどうやればいいんかいな?
455:デフォルトの名無しさん
08/06/22 22:44:31
宿題ですか?
456:デフォルトの名無しさん
08/06/22 23:37:58
OCamlのStream便利だな。。。何でもかんでもコレ使いたくなっちゃうわ。
何かマズいことあるのかな?
457:デフォルトの名無しさん
08/06/23 01:54:09
マズいことはないけど破壊的なのがなにかと使いにくいと思う。
458:デフォルトの名無しさん
08/06/23 01:56:52
>>457
つまりHaskell最高ってことか?
459:デフォルトの名無しさん
08/06/23 02:57:29
ほとんどのデータがint縛りっていうか、31bit制限があるところがツラいと思うんですが、
色々と工夫というかテクがあるなら教えて頂きたいです。
460:デフォルトの名無しさん
08/06/23 06:54:26
>>456
人生、これストリームなり
461:デフォルトの名無しさん
08/06/23 12:22:57
[1;2;3;4]を入力すると[1;3;6;10]を返す関数sigmaを書いたんですが
sigma関数の箇所、もっと効率的なやり方があるような気がしてむずがゆい感じがしてます。
何かアドバイスいただけないでしょうか
let iota n = List.init n ((+)1) in
let sum lst= List.fold_left (+) 0 lst in
let rec take n lst =
match n with
0 -> []
| 1 -> [List.hd lst]
| _ -> (List.hd lst)::take (n-1) (List.tl lst) in
let sigma lst =
List.rev (List.fold_left (fun x y->sum (take y lst)::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;
462:デフォルトの名無しさん
08/06/23 13:13:09
累積変数で、これまでの和を持ち運ぶ
463:デフォルトの名無しさん
08/06/23 14:45:07
ありがとう。こんな感じですかね
(途中まで同じ)
let sigma lst =
let accum = ref [] in
List.rev (List.fold_left (fun x y-> accum:=y::!accum; sum !accum::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;
464:デフォルトの名無しさん
08/06/23 15:38:22
えー。「ここまでの結果」を「引数で」持ちまわるんだよ。再帰終了するところでその引数をそのまま返す。
465:デフォルトの名無しさん
08/06/23 15:59:00
んー、持ち回る引数がfoldの中なので、プログラム全体の形、結構変わりますよね?
こういった変換は慣れていないので、ちょっと時間がかかりそうです
466:デフォルトの名無しさん
08/06/23 17:53:21
iotaとかsumとかtakeとかを使わないで、さらにfoldにこだわらなくて、かつ再帰を使っていいなら
こんなのはどうっすかね?
let sigma l =
let rec sigma' cur r = function
| [] -> List.rev r
| x::xs -> let next = cur + x in sigma' next (next :: r) xs in
sigma' 0 [] l
# sigma [];;
- : int list = []
# sigma [1;2;3;4;5;6];;
- : int list = [1; 3; 6; 10; 15; 21]
foldとかを使ったもっとElegante"〜{エレガンテ}〜"な方法を希望ならスマソ。
467:デフォルトの名無しさん
08/06/23 20:17:29
こんな感じ。
reverse $ snd $ foldl (\(a,xs) b -> let x = a + b in (x,x:xs)) (0,[])
Haskellの構文を使ってるがMLでも同様のはず。
468:デフォルトの名無しさん
08/06/23 20:21:41
pairにする必要ないんじゃ…
tail $ reverse $ foldl (\a b -> (head a + b):a) [0]
469:デフォルトの名無しさん
08/06/23 20:37:13
>>468
おお、こういうのがノータイムで出てくるようになりたいわ。
470:デフォルトの名無しさん
08/06/23 21:44:56
let sigma lst =
let rec sum lst =
match lst with
| [] -> []
| car :: cdr -> (List.fold_left (+) 0 lst) :: (sum cdr) in
List.rev (sum (List.rev lst));;
こんなんどうでっしゃろ?
471:デフォルトの名無しさん
08/06/23 21:48:14
>>467-468
おまいらHaskell大好きだなwwwww
472:デフォルトの名無しさん
08/06/23 22:44:06
MLの構文を知らずにこのスレを覗いてる奴が結構居ると予想
473:デフォルトの名無しさん
08/06/23 22:46:14
関数の中ですぐmatchするのってfunctionで書き直しちゃいたいんだけど。
474:デフォルトの名無しさん
08/06/23 23:08:55
let sigma l =
let rec aux store = function
| [] -> []
| x::xs -> x+store :: aux (x+store) xs
in
aux 0 l
これでok。末尾再帰じゃないけど。な。
475:デフォルトの名無しさん
08/06/23 23:31:25
うおお、皆さんありがとう!
いろんなやり方があって勉強になります
476:デフォルトの名無しさん
08/06/23 23:39:06
let ($) g f x = g (f x)
let sigma = (fun s -> rev $ fold_left (fun ys x -> s := x + !s; !s::ys) []) (ref 0)
477:デフォルトの名無しさん
08/06/23 23:43:15
let (@@) f x = f x
let sigma l = (fun s -> rev @@ fold_left (fun ys x -> s := x + !s; !s :: ys) [] l) @@ ref 0
478:デフォルトの名無しさん
08/06/23 23:47:55
let sigma = tl $ rev $ fold_left (fun ys x -> hd ys+x :: ys) [0]
479:Haskell 修業中
08/06/24 04:32:12
すんません。まさに >>472 なんですが…。
import List
sigma = tail.(scanl (+) 0)
480:デフォルトの名無しさん
08/06/24 21:58:08
対象かアーキュムレータの頭を累積値として利用する手もある。
let rec sigma = function
| [] -> []
| hd::[] -> hd::[]
| x::y::tl -> x::(sigma (x+y::tl));;
let sigma_rev l =
List.fold_left (fun acc hd ->
match acc with
| [] -> hd::acc
| last::_ -> hd+last::acc) [] l;;
481:デフォルトの名無しさん
08/06/24 23:31:17
>>479
tail . (scanl (+) 0)
↓
scanl1 (+)
でおっけ
482:Haskell 修業中
08/06/24 23:48:01
>>481
おおっ!そんなのがあるんですね。
やっぱ、Haskellすごいわ
スペースを入れてもわずか10文字w
483:デフォルトの名無しさん
08/06/25 01:45:08
意味不明なライブラリ関数の海で遊んで溺れかけているHaskellianにしか見えない。
逆に、OCamlには関数なさすぎ砂漠なわけだが。
484:デフォルトの名無しさん
08/06/26 17:36:09
Haskellそこらじゅうで大人気だな。
ム板住民の半分はHaskell(かRuby)好きなんじゃないかと思えてくるわ。
OCamlはデフォルトでは関数も文法も少ないけど自分で定義しなさい、みたいな所がCっぽくて好き。
let scanl1 f = function | [] -> [] | (x::xs) -> scanl f x xs
let scanl f x y = List.rev (List.fold_left (fun a b -> (f (List.hd a) b) :: a) [x] y)
で
scanl1 (+) [1;2;3;4];;
ってできるし。
HaskellとOCamlの差が出てくるのはやっぱりIOとかかね。
485:デフォルトの名無しさん
08/06/26 18:20:16
refを沢山使うprogramをHaskellで書くのは大変。
Ocamlで書くのが大変なのは…特にないな。遅延計算くらいか。
486:デフォルトの名無しさん
08/06/26 18:34:02
ファイルを順々に読んでいく、みたいのはHaskellだと遅延評価だから普通のリストと同じように出来るけど、
OCamlだとバッファリングするとかストリームとか多少は副作用がある方法を使わなきゃいけないかなー。
まあ他の言語ではみんなそうしてるから特に抵抗は無いが。
487:Haskell 修業中
08/06/26 18:35:15
>>485
Streamって遅延計算じゃないんですか?
488:Haskell 修業中
08/06/26 18:37:26
あっ、かぶったw
やっぱりStream使うんですね。
489:デフォルトの名無しさん
08/06/26 18:56:37
Streamはかなり便利だけど、
Haskellでは通常のリスト操作みたいに出来るっていうのはやっぱり魅力だよな。
使い方にもよるがソースがStream.junk ();とかだらけになるのは美しくないので避けたい。
490:デフォルトの名無しさん
08/06/26 20:28:23
>>485
たとえば?
俺がHaskellですっきり書いてやるよ。
491:デフォルトの名無しさん
08/06/27 18:43:09
ocamlcってgccの-O0みたいなオプションないのかな
というかこんなことを平気で聞いてもよさげな初心者スレないのかな
492:デフォルトの名無しさん
08/06/27 22:56:35
というかこんな意味不明なこと平気で聞くなよ。
kwsk
493:デフォルトの名無しさん
08/06/28 01:38:52
>>492
ocamldebugを使ってみた
↓
Eventなのに止まらないだと・・・?
↓
きっとコンパイラが最適化してるからだ!
↓
ocamlのコンパイラって最適化無効にするオプションないのかな←今ここ
ocamldebugのstep実行で止まるはずのポイント飛ばされたり、
プロファイラで使われているはずの関数が未使用と判定されたり、
言語以前にツールの使い方覚えるとこで俺\(^o^)/
494:デフォルトの名無しさん
08/06/28 02:23:23
全然初心者的内容じゃねーじゃん。ocamlc (ocamloptもそうだが) は
最適化みたいなことはほとんどしてないんで。書いたとおりに実行するよ。
優秀なOCamlプログラマを大勢知っていますが、大多数はデバッガの必要を感じていません。
俺もデバッガは使わないので何ともいえんが、何か使いかたを過っているか、
camlの評価順なぞを未理解なのではないかと思われ…
495:デフォルトの名無しさん
08/06/28 03:05:49
>>490
ICFP PC 2007の問題とかどうよ?
RNA実行するだけでも副作用なしだと大変じゃないかな
496:デフォルトの名無しさん
08/06/28 05:35:04
>>494
皆使ってなかったのか・・・
ソース解析する際流れ追うのに使えるかと思ったんだが
>何か使いかたを過っているか、
>camlの評価順なぞを未理解なのではないかと思われ…
どっちも怪しいのでもちっと勉強してくる
497:デフォルトの名無しさん
08/06/28 10:30:39
>>494
そういうのって全部ログコードはいてチェックするんですか?デバッグとそういうやり方併用してるけれど全部それだとチョイきつそう。
498:デフォルトの名無しさん
08/06/28 14:39:27
コードを綺麗に書けば、printf デバッグと、十分なユニットテストで 大抵バグは潰せる。
デバッガでちまちまやる前に、assertion と Printexc.get_backtrace でかなりのことはわかるはずだが。
Cのデバッガのように必須だという認識の人は少ないと思われ。
もちろん使うなとは言わん。ocamldebugはリプレイとか強力。
499:デフォルトの名無しさん
08/06/28 23:12:07
>>498
cの場合は破壊的操作と非破壊的操作をあまり意識せずにプログラミングすることもあるから
余計に必要になってくるのではないか?それに、小さな関数の定義を作って大きくするより、
一つでまとめて操作すると言う習慣も影響してるかも。
500:デフォルトの名無しさん
08/06/28 23:45:19
Cは(普通は)インタプリタがないからっていう部分も大きいと思う。
501:デフォルトの名無しさん
08/06/29 03:08:23
ちょっとcodepadが使えるのか試してみたよ。
URLリンク(codepad.org)
502:デフォルトの名無しさん
08/06/29 03:21:42
C は REPL が無いからね
503:デフォルトの名無しさん
08/06/29 20:22:57
lisp的なREPLを備えたC環境なんてないよな。確かに…
あってもいいんだけど。
504:デフォルトの名無しさん
08/06/29 20:55:26
gdbは?
505:デフォルトの名無しさん
08/06/29 20:58:08
そういえばこんなのがあったの忘れてたわ。
C-REPL
URLリンク(neugierig.org)
506:デフォルトの名無しさん
08/06/29 20:58:59
Haskell製か
507:デフォルトの名無しさん
08/06/29 22:53:12
>>504
>Cのデバッガのように必須だという認識の人は少ないと思われ。
だから普通はそういう事なんだろうなww
まあgdbではlispとかcamlとかみたいに書いて即テストって訳にはいかないがgdbは便利だよな。
508:デフォルトの名無しさん
08/07/05 03:43:57
>>454亀だがちょうど最近覚えたので確認のために
fun swap (date,i,j)=
let
val a = Array.sub(date,i)
val b = Array.sub(date,j)
in
Array.update(date,i,b);
Array.update(date,j,a)
end
localでArrayをopenしておいたほうが綺麗かも
509:デフォルトの名無しさん
08/07/22 18:35:13
すんまそん、Ocamlで日本語文字は扱えませんか?
例えば正規表現なんかでも使いたいんですが。
510:デフォルトの名無しさん
08/07/22 20:41:48
OCamlのstring型は任意のバイナリが入るので、標準入力とかファイル経由で扱うなら
日本語でもなんでもあり。
ただし、OCamlのソースコードに日本語を埋め込みたいなら、EUC_JP以外使えないと思う。
EUC_JPなら、普通にperl互換正規表現ライブラリのラッパーが使える。
URLリンク(pcre-ocaml.sourceforge.net)
データをUNICODEとして扱うなら、Camomileで日本語「文字」を扱えますね。
URLリンク(camomile.sourceforge.net)
あと、正規表現で日本語を扱う問題はOCamlに限らずどれでも一緒なので、
URLリンク(www.din.or.jp)
あたりをどうぞ。
511:デフォルトの名無しさん
08/07/22 22:03:32
最後のURLは、perlのやり方としては古くて、
(今や\p{Hiragana}という風に"script"を文字クラスとして指定できるので)
「どれも一緒」というよりも、Ocamlだとこのやり方が有効って事になると思います。
512:デフォルトの名無しさん
08/07/22 22:16:11
UTF8 で書いて pcre-ocaml の `UTF8 オプションを使え。あと camomlile。以上。
513:デフォルトの名無しさん
08/07/23 22:25:46
MLtonのFFIを使って、Cのmain関数からSMLを呼びたいのだが、これは
不可能?
514:デフォルトの名無しさん
08/08/10 15:52:08
URLリンク(www.cs.caltech.edu)
こんなのをみっけたけど、ゆうめいなん?
515:デフォルトの名無しさん
08/08/13 08:08:15
OCamlの入門記事
URLリンク(indori.blog32.fc2.com)
516:デフォルトの名無しさん
08/08/13 16:19:54
何よりもピヨが気になる
517:デフォルトの名無しさん
08/08/14 08:38:28
>>515
入門記事というより、入門している記事
518:デフォルトの名無しさん
08/08/14 08:51:30
>> 514
数ヶ月前に見たので、うろ覚えだけど、optional arguments や polymorphic variants が
かなり早期に出てくる。そういう点では、こういう新しい機能をおまけとして解説してきた、
「OCaml を使ってプログラミングを学ぶ」本とは毛色が違い、より OCaml 自体を学ぶ事に
重点が置かれている。class についても最後にかなりページ数が割かれている。
519:デフォルトの名無しさん
08/08/14 09:07:36
>> 518 続き
そういうわけで、ひととおり関数型言語のコンセプトについて理解した人には
OCaml リファレンスとしていいんじゃないかと思う。
520:デフォルトの名無しさん
08/08/14 10:11:59
>>519
解説ありがとう。なるほど他言語をやっていて、始めようとする人向きだということが
分かりました。
521:デフォルトの名無しさん
08/08/17 00:31:48
>>515
Winでパフォーマンス落ちるのはバイトコードの話でしょ?
ネイティブなら問題ない
522:デフォルトの名無しさん
08/08/24 14:59:04
smlからsml#に移行しようとしてるんだけど,
型エラー(?)が出て実行できないのがある.
誰か助けて...
次のレスにエラーが出るプログラムを貼ります.
523:522
08/08/24 15:00:46
リストを使った集合演算のプログラムです.
(他にもエラーが出るプログラムはあるのだけど,
とりあえずある中で一番小さいもの)
まずはシグネチャ
signature SET =
sig
eqtype 'a Set
exception EmptySet
val emptyset : 'a Set
val elem : 'a Set -> 'a * 'a Set
val member : ''a -> ''a Set -> bool
val add : ''a -> ''a Set -> ''a Set
val map : ('a -> 'b) -> 'a Set -> 'b Set
val allelem : ''a Set -> (''a * ''a Set) Set
val fromList : 'a list -> 'a Set
val toList : 'a Set -> 'a list
end;
524:デフォルトの名無しさん
08/08/24 15:01:24
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?
■Wiki
URLリンク(www36.atwiki.jp)
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
URLリンク(ex14.vip2ch.com)
525:522
08/08/24 15:02:24
次はストラクチャ(の一部)
structure Set :> SET =
struct
type 'a Set = 'a list;
exception EmptySet;
val emptyset = [];
(* Compute a pair of the element of input lists and rest set *)
fun elem [] = raise EmptySet
| elem (x::xs) = (x,xs);
(* Check whether x is an element of a set *)
fun member _ [] = false
| member x (y::ys) = (x = y orelse member x ys);
526:522
08/08/24 15:05:15
(続き)
(* Add an element to a set *)
fun add a A =
if member a A then A
else a::A;
val map = List.map;
(* Compute {(a,A \ {a}) | a \in A} *)
(* where A is an input set *)
fun allelem A =
let
val (b,B) = elem A
in
add (b,B) (map (fn (c,C) => (c, add b C)) (allelem B))
end
handle EmptySet => emptyset;
fun fromList l = l;
fun toList l = l;
end;
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5296日前に更新/149 KB
担当:undef