関数型言語ML(SML, OCaml, etc.), Part 5at TECH
関数型言語ML(SML, OCaml, etc.), Part 5 - 暇つぶし2ch331:デフォルトの名無しさん
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;

527:522
08/08/24 15:09:53
で,以下を実行するとエラーが出ます.
(SMLでは大丈夫だった)

Set.toList (Set.allelem (Set.fromList [1,2,3,4,5]));

エラーは以下のとおりです.
Diagnoses:
stdIn:12.1-12.49 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
annotation: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
stdIn:12.1-12.49 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
operand types: (int * int Set.Set) Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
annotation: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
expression type and annotation don't agree
expression type: int * int Set.Set
annotation: int * int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: int Set.Set -> expression
annotation: int Set.Set -> expression

528:522
08/08/24 15:11:46
(エラー続き)

stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
expression type and annotation don't agree
expression type: int * int Set.Set
annotation: int * int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: int Set.Set -> expression
operand types: int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
operand types: int * int Set.Set -> expression

529:522
08/08/24 15:13:41
(さらに続き)

stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) list -> expression
operand types: (int * int Set.Set) list
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set) list -> expression
annotation: (int * int Set.Set) list -> expression
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) list -> expression
operand types: (int * int Set.Set) list
BUG :invalid type

530:デフォルトの名無しさん
08/08/25 02:01:56
数学における記法の話です
大学入試の問題文の冒頭で
「f(x)=x^3+3x^2とする」とあるのですが
この=はC言語と同様に、右辺の関数にfという名前を付けるという
意味での=つまり;=のことでしょうか?

531:デフォルトの名無しさん
08/08/25 02:06:58
C言語では関数に名前をつけるときに=を使わないのでは?

532:デフォルトの名無しさん
08/08/25 02:59:26
>>530 関数型言語MLについて語るスレッドです。

533:デフォルトの名無しさん
08/08/25 04:08:36
>>532
すみません、これだけでいいので分かる方いたら教えてください

534:
08/08/25 05:21:23
WindowsでOCamlを使うには、「MinGW」もしくは「Microsoft Visual C++ and Microsoft Assembler」が必要になります
って読んだんだけどOcamlのコンパイラってCへのトランスレーターなの?

535:デフォルトの名無しさん
08/08/25 07:18:20
アセンブラでsho

536:
08/08/25 16:19:07
アセンブラですか。どうもありがとう。

537:デフォルトの名無しさん
08/08/25 17:17:37
>>530
夏休みも終わりだねえ


538:デフォルトの名無しさん
08/08/25 23:17:08
>>522
閑古鳥の鳴いてるメーリングリストを活性化するために話題を投げてくれ


539:デフォルトの名無しさん
08/08/26 20:17:38
>>522
SML#のバグじゃないかな・・・?
次回アップデートに期待としか。

540:デフォルトの名無しさん
08/08/27 08:46:12
URLリンク(eigenclass.org)


541:デフォルトの名無しさん
08/08/27 08:51:16
warota

542:061123251194.cidr.odn.ne.jp
08/09/19 18:58:37
よいコンパイラの教科書(当然関数型)があれば紹介してください。和英こだわりません。


543:デフォルトの名無しさん
08/09/19 19:00:51
まずはnavi2chのスレをみたほうがいいかもしれない

544:061123251194.cidr.odn.ne.jp
08/09/19 19:05:21
そのようですね。


545:542
08/09/19 19:29:56
おさわがせしました。昔の navi2ch がパスに残っていた、、、ダサいな




546:デフォルトの名無しさん
08/09/19 19:31:39
ところで、
・処理系を関数型言語で書きたい
・関数型言語の処理系を書きたい
どっち?

547:542
08/09/19 19:38:53
コンパイラを書きたい、ですね。(多分書かないけど)


548:デフォルトの名無しさん
08/09/19 19:44:24
ワラ


549:デフォルトの名無しさん
08/09/19 20:24:30
や、だから
・コンパイラを関数型言語で書きたい
・関数型言語のコンパイラを書きたい
のどっちなのかということですよ

550:デフォルトの名無しさん
08/09/19 21:16:48
MLでコンパイラの教科書って有名なの1冊しかないんじゃないの?
いいかどうかは知らない。

551:デフォルトの名無しさん
08/09/19 21:25:48
洋書で青い表紙で虎のやつのこと?モダンなんちゃらだっけ?
EOPLはschemeでML処理系を作るやつだったよね

552:デフォルトの名無しさん
08/09/19 21:27:18
「Modern Compiler Implementation In ML」かな…
持ってるけど、読んでない…

553:デフォルトの名無しさん
08/09/19 22:41:49
まだモダンなのかなぁ

554:デフォルトの名無しさん
08/09/19 23:00:15
近代はずっと近代。もっと新しいのは現代。

555:デフォルトの名無しさん
08/09/20 11:27:06
計算機の本で「コンテンポラリー」を名乗ったものって記憶にないなぁw
なんかあったっけ?

556:デフォルトの名無しさん
08/09/20 11:54:33
まだポスト・モダンが出現してないから。

557:デフォルトの名無しさん
08/09/20 12:10:11
学会のサブタイトルなら見たことある。

558:デフォルトの名無しさん
08/09/20 17:03:51
GODIがインストールできない。bootstrap_stage2で失敗する。

~/Desktop/godi-rocketboost-20080630$ sudo ./bootstrap --prefix /usr/local/godi
...
Bootstrap was successful!
...
Selected GODI section: 3.10
...
~/Desktop/godi-rocketboost-20080630$ PATH=/usr/local/godi/bin:/usr/local/godi/sbin:$PATH
~/Desktop/godi-rocketboost-20080630$ export PATH
~/Desktop/godi-rocketboost-20080630$ sudo ./bootstrap_stage2
.: 1: godi_confdir: not found
Error: Command fails with code 2: /bin/sh
Failure!
~/Desktop/godi-rocketboost-20080630$

なんでだろう。
URLリンク(d.hatena.ne.jp)
の言う通り3.10に対応してないのだろうか?
それとも根本的なところを勘違いしてる?
OCaml初心者ですが、GODIが必要です。

559:デフォルトの名無しさん
08/09/23 09:30:04
> OCaml初心者ですが、GODIが必要です。
この前提が、なんか、もう。


560:デフォルトの名無しさん
08/09/27 19:06:57
NumとかBig_intのプリンタが欲しいとか?

561:デフォルトの名無しさん
08/09/29 10:13:03
たかがそんなもののために GODI が必須で、
GODI がインストールできないから使えない、というのは間違ってますね。

逆に、GODI 依存ユーザからお前のライブラリ GODI にポートしろとか
当然のように言われるのも迷惑です。


562:デフォルトの名無しさん
08/09/29 21:15:32
OCamlってライブラリ関連でコミュニティの足並みそろってないせいで言語の良さがかすんじゃってる感ある。

563:デフォルトの名無しさん
08/09/30 11:52:19
足並み揃えて大きな標準ライブラリ作ればって話は昔からあるし、今もOCamlForgeとかでやってるけど、なかなか成果が出ない。
なんでだろう?

564:デフォルトの名無しさん
08/09/30 13:34:01
これからはHaskellだから

565:デフォルトの名無しさん
08/10/01 16:14:10
windowsXPを使っていて、ML言語を使えるようにしたいので、インストール方法をどなたか教えていただきたいのですが・・・


566:デフォルトの名無しさん
08/10/01 16:17:28
じゃ、f# がいいんじゃない?
インストーラーがあるよ

567:デフォルトの名無しさん
08/10/01 19:53:20
OCamlにだってWindowsのインストーラくらいはさすがにある。

568:デフォルトの名無しさん
08/10/01 23:00:11
>>567
コンパイルできないやつか
コンパイルしても動かないやつしかない

569:デフォルトの名無しさん
08/10/02 08:45:56
>>565
cygwin入れれば標準でocaml入ってるよ。

570:デフォルトの名無しさん
08/10/02 14:34:32
cygwin入れるならデュアルブートか仮想化するなぁ…

571:デフォルトの名無しさん
08/10/03 04:07:14
SML#はプロジェクトのページにインストールから簡単なプログラミングまでチュートリアルがあったはず

572:デフォルトの名無しさん
08/10/03 12:52:15
>>565
こーゆー時のためにURLリンク(ocaml.jp)です。
OCamlのインストール方法からチュートリアルまで揃ってますよ。

573:デフォルトの名無しさん
08/10/03 15:53:52
相変わらずマルチバイト扱いにくいね


574:デフォルトの名無しさん
08/10/03 17:01:09
使い方がさっぱりわからないunicodeライブラリならあるよ

575:デフォルトの名無しさん
08/10/04 00:03:39
>>574
それ扱いやすいって言わないよ~ orz

普段使いで文字列扱うせいでこまるんだよな、言語自体好きなのに。


576:デフォルトの名無しさん
08/10/04 09:44:20
日本語でおk

577:デフォルトの名無しさん
08/10/06 11:30:36
ocamlのコンソールの使いにくさは異常。
pythonならC-b, C-fでカーソルの移動ができたり、
emacsの標準的なキーが使えるから気軽にコンソールでためせる。



578:デフォルトの名無しさん
08/10/06 11:58:55
>>577
ledit使え、と思ったらなんか終わってるらしい。
どうしたものか...

579:デフォルトの名無しさん
08/10/06 12:01:10
rlwrap

580:デフォルトの名無しさん
08/10/06 12:14:31
inf-caml使えばいい

581:577
08/10/06 13:12:12
みなさんありがとうございます。
ためして見たところrlwrapを使うことにしました。

すごいです!!ありがとう!



582:デフォルトの名無しさん
08/10/06 21:34:32
>>578
>ledit使え、と思ったらなんか終わってるらしい。
え、終わってるって、どういうこと?
俺、ledit 使ってるけど

583:デフォルトの名無しさん
08/10/07 12:19:07
>>582
ledit終了 でぐぐるとトップに出てくるブログに書かれてる情報絡みのことじゃないかと

584:デフォルトの名無しさん
08/10/09 11:03:05
3.11 のブランチ release311 が ocaml-cvs に出来ました。おそらくもうすぐリリースですね。

3.11 の目玉

* native判のモジュールの dynamic link
* private abbreviation type
* Printexc.print_backtrace 等、デバッグに役立ちそうな backtrace 系関数数種
* ocamlnat: native の toplevel (デフォルトでは作らないそうな)


585:デフォルトの名無しさん
08/10/09 12:12:17
>native判のモジュールの dynamic link

これって既に10で出来るようになったんじゃなかったけ?
と思ったら、今は dynlink.cmxa をリンクしないといけないのか
これは便利だな

586:デフォルトの名無しさん
08/10/10 12:01:15
法政大学の児玉先生の所におかれている
URLリンク(yk.i.hosei.ac.jp)

をいまどきのSMLNJで動かすにはどう変更したらよいでしょうか.
ord(#"0")はすぐわかりましたが,lookaheadなどがcharを期待してして
いるのが仕様変更になったようで,elem をどうやってやればcharで
使えるのかが判然としません.


587:デフォルトの名無しさん
08/10/15 09:18:45
OCamlの次世代デファクトスタンダードライブラリを目指すBatteriesがα1をリリースしたらしい。

URLリンク(dutherenverseauborddelatable.wordpress.com)

一応前から内容は見ていて、OCamlのベースライブラリをモダンな階層構造に再編集しているのはすばらしいと思う。
ただ、ちょっと既存の外部ライブラリに頼りすぎていて、枝葉になるほど寄せ集め感が否めないのが気になる。
将来これに一本化されていくのかなー?私もこれに乗るのかどうか、今悩み中。


588:デフォルトの名無しさん
08/10/15 15:52:01
過疎ってるからって hatena からそのままコピペするのはよそうよ


589:osiire
08/10/15 19:04:27
誰ですか、私のエントリーをコピペしたのは。
別にいいですけど、一人称くらい変更してくれてもいいのに。

590:デフォルトの名無しさん
08/10/24 21:49:05
3.11の目玉の一つの、private abbreviation type って何でしょか?
private typesでもなくprivate row typesでもない、なにか?まぎらわしー。

591:デフォルトの名無しさん
08/10/26 20:54:39
過疎ってるから
俺がocaml勉強日記を書いてあげようか?

わからないことがあったら答えて下さいね!

592:デフォルトの名無しさん
08/10/26 23:04:30
断る

593:デフォルトの名無しさん
08/10/26 23:12:42
面白くなりそうだったらいいよ。

594:デフォルトの名無しさん
08/10/26 23:21:06
>>591
おう、かいてたらいいよ。

595:デフォルトの名無しさん
08/10/27 10:53:31
module M : sig
type nat = private int
val nat_of_int : int -> nat
val int_of_nat : nat -> int
end = struct
type nat = int
let nat_of_int n =
(assert (n >= 0));
n
let int_of_nat n = n
end


596:デフォルトの名無しさん
08/10/27 15:21:06
>>595
レスどうも。
この例は、signatureでtype natとして隠蔽した場合と何が違うのでしょう?
試してもprinterが<abstr>になるかどうかくらいしか違い分かりませんでした。
どういう利用法があります?

597:デフォルトの名無しさん
08/10/27 15:53:58
ぐぐったらあったorz ↓
URLリンク(d.hatena.ne.jp)
subtypingとは気づかなかった。

598:デフォルトの名無しさん
08/11/01 12:46:43
nullとnilの違いを教えてください。

599:デフォルトの名無しさん
08/11/01 13:20:42
null:物の表面に液や塗料をなすりつけること。
nil:食物を、水または調味料を加えた汁に入れて加熱し、食べられる状態にすること。

600:デフォルトの名無しさん
08/11/01 14:51:15
>>599
スレリンク(tech板)l50

601:デフォルトの名無しさん
08/11/02 02:49:24
SMLにおいて、nullとnilの違いを教えてください。


602:デフォルトの名無しさん
08/11/02 02:53:01
nilは空のリスト。
nullはListストラクチャーの、リストを受け取りnilかどうかをboolで返す関数。

603:デフォルトの名無しさん
08/11/02 03:21:30
nullp

604:デフォルトの名無しさん
08/11/02 03:35:53
>>599
ウケ狙いなら、残念。もう一ひねりホシイ。

605:デフォルトの名無しさん
08/11/02 07:43:26
ウケ狙いならって・・・
他に何があるというのか小1時間(ry

606:デフォルトの名無しさん
08/11/04 06:30:51
独学でSMLの本を使いながら関数言語を学んでいるのですが、上手くできない問題があり困っています。

replicate(4);
と打つと、
val it = [1,2,2,3,3,3,4,4,4,4] : int list
といった感じに1を一つ,2を二つ、3を三つ、4を四つといったリストを
出力されるSMLのリカーシブメソッドを書きたいのですが、上手く行きません。分かる方教えていただけると助かります。

607:デフォルトの名無しさん
08/11/04 07:09:08
うまくいかなかったやつを載せてみてよ。

608:デフォルトの名無しさん
08/11/04 08:14:40
>>606
リカーシブメソッドっていうのが何を差してるのか分からないけど、
入力: 自然数n
出力: 要素が全てnで長さnのリスト
とするサブ関数使えばいいんじゃない?

609:デフォルトの名無しさん
08/11/04 08:21:09
n
[1,2,3,...,n]
[1,22,333,...,n,n,n,n,]
の二行目から三行目で>>608使えばいいな。

610:デフォルトの名無しさん
08/11/04 09:16:29
recursive
再帰だな。

611:608
08/11/04 09:29:59
とりあえず作ってみた。
>>609のやりかたとは違います。
↓にあっぷしてみたので、ご参考までに。
URLリンク(www2.uploda.org)
(パスは sml です)

入力は自然数(0以上)を仮定しています。

612:デフォルトの名無しさん
08/11/04 12:47:57
あー、答えちゃったの?どう読んでも宿題なんだから、自分で考えさせてあげなきゃ。

613:608
08/11/04 18:17:23
>>612
やっぱそうだよねぇ。
「独学で」なんて書いてるから、
にっちもさっちも行かなくなったと思っちゃったんだよね。
やっぱ、寝ないとだめだな。

614:デフォルトの名無しさん
08/11/04 23:34:42
>>612>>613
良く寝て頭を休めろ。

615:デフォルトの名無しさん
08/11/05 00:11:55
SMLならメソッドじゃなくてファンクションだろ、とどうでもいい突っ込み。
再帰関数はn-1番目からn番目を導出する定義をそのまま書くのがコツ。
もう>>606は見てないだろうけど。

616:デフォルトの名無しさん
08/11/05 00:43:05
宿題でも独学でもどっちでもいいのでは。

617:デフォルトの名無しさん
08/11/05 00:55:48
URLリンク(xy.yu.to)
始終荒れまくりの海外サーバ絵チャだ

一人の神プログラマーが強すぎてマクロ荒しが全く太刀打ちできてない。
荒しプログラマーは全員退散!!
誰か倒してくれwwwwww


618:デフォルトの名無しさん
08/11/05 01:15:09
>>611
わざわざお答え頂ありがとうございます。
一応こちらもパターンマッチングでない、if - elseの方法で出来ました。ネストしたループのfunctionの前にletが抜けていただけでした。
参考になりました。

619:デフォルトの名無しさん
08/11/05 04:09:40
>>618
こういう課題は論理型の方がすっきりした定義になるね。

620:デフォルトの名無しさん
08/11/09 12:02:17
すんません教えてください。

(int -> int -> int) -> int

という関数の定義例が分かりません。

(int -> int) -> int -> int なら
たとえば
let func = fun f x -> (f 2) * x;;
でいいことが分かるのですが、

(int -> int -> int) -> int
だとわからなくなります。

『二つのintを引数とし、intを返す関数』を一つの引数としてとり
intを返す関数というふうに理解してます。

コードはどのように考えればよいんでしょうか?

621:デフォルトの名無しさん
08/11/09 12:48:12
なんでもいいけど
let func f = (f 1 2) + 3;;

622:デフォルトの名無しさん
08/11/09 14:05:34
>>621
ありがとうございます。
理解しました。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch