関数型プログラミング ..
511:デフォルトの名無しさん
08/08/17 21:49:13
俺も>>509みたいに感じるなあ
抽象度が違うのは理解できるが
512:507
08/08/17 21:58:16
抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの
遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。
普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。
513:デフォルトの名無しさん
08/08/17 21:59:06
じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは
もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
514:デフォルトの名無しさん
08/08/17 22:31:24
>>512
だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。
結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
515:デフォルトの名無しさん
08/08/17 22:45:32
念のため補足。
>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。
>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。
個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
516:デフォルトの名無しさん
08/08/17 22:50:03
変な実装=全順序じゃない、と読み替えてくれ。
コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
517:デフォルトの名無しさん
08/08/17 23:19:23
ごめん、誤解を招くといやなのでもう一つ補足……
>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。
518:初心者修業中
08/08/17 23:37:55
ん?
実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。
そういう意味ではないのかな…
519:デフォルトの名無しさん
08/08/17 23:41:24
Haskellをみて日本のhaskellコミュって元気なの?
他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?
520:デフォルトの名無しさん
08/08/17 23:58:38
>>518
たとえば、
1:2:3:[]は、
1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、
1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
でも結果は一緒でしょ?
同じように、
Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力
みたいなのは、まぁ言ってみれば(不正確だけど)
[Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。
この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。
getContentとかは実はこれを使って実装されている。
Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)
521:デフォルトの名無しさん
08/08/18 00:02:55
Maybeの特化にしか見えません
522:36 ◆K0BqlCB3.k
08/08/18 00:25:49
>>519
世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
523:デフォルトの名無しさん
08/08/18 01:36:55
>>520
後者の簡約は型がおかしいし、1:2:3:[]ではなく、
f x = (unsafePerformIO $ print x) `seq` xで
f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。
前者は3,2,1で後者は1,2,3
一方で(>>=)は最左最外簡約でも最右最内簡約でも
左から順にしか値が定まらないようになってる。
putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c)
(>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。
524:デフォルトの名無しさん
08/08/18 03:17:18
>>522
元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
525:デフォルトの名無しさん
08/08/18 04:14:24
ruby
526:デフォルトの名無しさん
08/08/18 08:38:27
>>520
> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
型が滅茶苦茶だよ。
> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。
527:デフォルトの名無しさん
08/08/18 10:05:00
Haskellにこういう奴が多い気がするのはなぜだ
528:デフォルトの名無しさん
08/08/18 10:21:37
「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、
想像力の貧しい奴がこのスレに多いような気がする
529:デフォルトの名無しさん
08/08/18 13:36:03
末尾が「気がする」で終わってるレスは
全部気のせいのような気がする
530:デフォルトの名無しさん
08/08/18 15:08:49
なんという自己言及レス
531:デフォルトの名無しさん
08/08/18 15:12:16
関数型らしくて言いじゃないか
532:デフォルトの名無しさん
08/08/18 15:41:06
>>531
つ座布団1枚
533:デフォルトの名無しさん
08/08/18 21:50:15
* -> * -> * ってどんなとき使うの?
534:デフォルトの名無しさん
08/08/18 22:25:25
アナルトレイン
535:デフォルトの名無しさん
08/08/19 07:45:46
( ゚д゚)゚д゚)゚д゚)
/ つ つ つ
(_(_ ノ ノ ノ
し∪ ∪ ∪
536:デフォルトの名無しさん
08/08/19 10:10:53
>>505
> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
プログラミング言語一般での話なら「抽象データ型」でしょうね。
537:デフォルトの名無しさん
08/08/19 11:50:46
>>533
関数(->)とかタプル(,)とか
538:デフォルトの名無しさん
08/08/20 20:24:46
485でおま。
それでなのです。 >ときどきの雑記帖の中の人
539:デフォルトの名無しさん
08/08/21 14:40:13
Arrow は * -> * -> * のクラス
MonadTrans は (* -> *) -> * -> * のクラス
540:デフォルトの名無しさん
08/08/21 21:20:37
URLリンク(book.realworldhaskell.org)
これの30章が消えてるんだけど・・・。
541:デフォルトの名無しさん
08/08/21 22:05:29
本買えよ
542:デフォルトの名無しさん
08/08/21 23:26:23
30章だけが読みたいんだよ。
ところで、HaskellでPetStoreってあるの?
543:36 ◆K0BqlCB3.k
08/08/21 23:56:58
>>542
横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?
544:デフォルトの名無しさん
08/08/22 00:08:29
>>543
面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。
545:デフォルトの名無しさん
08/08/22 11:40:45
Haskellでウェブアプリというとふつう本か
546:36 ◆K0BqlCB3.k
08/08/22 12:37:40
最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、
ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
547:デフォルトの名無しさん
08/08/22 12:41:19
>>546
WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。
548:デフォルトの名無しさん
08/08/22 12:41:59
まだ横ばいならたいしたもんだ
549:デフォルトの名無しさん
08/08/22 12:48:26
>HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?
550:デフォルトの名無しさん
08/08/22 13:05:36
あまり考えずに気の向くままに書いてもあっさり動くのが
ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある
551:デフォルトの名無しさん
08/08/22 13:10:45
WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。
だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
552:デフォルトの名無しさん
08/08/22 13:11:10
ここでHaskellは人間の思考過程に最も近いから
考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
↓
553:デフォルトの名無しさん
08/08/22 13:23:23
|
( ゚д゚ )↓
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
554:デフォルトの名無しさん
08/08/22 13:27:58
>>550
それならHaskellもライトウェイトで良くね?
555:デフォルトの名無しさん
08/08/22 14:05:36
明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。
556:デフォルトの名無しさん
08/08/22 14:18:04
LLとかWebアプリとか、
だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。
557:デフォルトの名無しさん
08/08/22 14:22:47
>>555
runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど
558:デフォルトの名無しさん
08/08/22 14:34:05
>>556
そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん
559:デフォルトの名無しさん
08/08/22 14:46:33
>>552
Prologには負けるんじゃない。
560:36 ◆K0BqlCB3.k
08/08/22 14:47:15
runghcはオーバーヘッドもかなり大きいみたいだね。
$ cat hello.hs
main = putStrLn "hello"
$ time runghc6 hello.hs
hello
real 0m0.835s
user 0m0.780s
sys 0m0.052s
$ cat hello.rb
print "hello\n"
$ time ruby hello.rb
hello
real 0m0.015s
user 0m0.012s
sys 0m0.000s
561:36 ◆K0BqlCB3.k
08/08/22 14:48:14
$ cat hello.pl
print "hello\n"
$ time perl hello.pl
hello
real 0m0.007s
user 0m0.004s
sys 0m0.000s
$ cat hello.py
print "hello"
$ time python hello.py
hello
real 0m0.035s
user 0m0.020s
sys 0m0.016s
562:デフォルトの名無しさん
08/08/22 15:03:43
LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?
563:デフォルトの名無しさん
08/08/22 15:07:56
WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、
Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。
ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
↓
564:デフォルトの名無しさん
08/08/22 15:38:43
HaskellもLL言語だよ
565:デフォルトの名無しさん
08/08/22 15:45:06
これどうなの?
URLリンク(happs.org)
566:デフォルトの名無しさん
08/08/22 16:09:31
Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。
満足した?
567:デフォルトの名無しさん
08/08/22 17:42:48
haskellは型推論がちゃんと効いてる使い方が出来れば、LL的な生産性は確保できるだろう。
だがな、至高の存在で良いじゃないか。
haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる
分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に
苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに
なってるんでしょうね。
だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?
568:36 ◆K0BqlCB3.k
08/08/22 18:09:07
>>567
もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)
569:デフォルトの名無しさん
08/08/22 18:44:00
某氏のhapps解説はお流れ?
>>567
> 破壊的操作がほとんどできない
なんで?
570:デフォルトの名無しさん
08/08/22 18:58:34
なんでそんなにHaskellの応用分野を限定したがるんだw
>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?
571:デフォルトの名無しさん
08/08/22 19:43:28
ウイルス対策ソフトのように危機感を煽るのはいいが、
既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね
572:デフォルトの名無しさん
08/08/22 19:54:17
>>570
Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?
573:デフォルトの名無しさん
08/08/22 20:37:03
Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは
まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。
研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。
574:デフォルトの名無しさん
08/08/22 20:53:32
>>572
アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ
575:デフォルトの名無しさん
08/08/22 21:35:41
>>574
Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。
576:デフォルトの名無しさん
08/08/22 21:53:05
>>540
30章ってなんの章だったの?
577:デフォルトの名無しさん
08/08/22 22:12:26
>>575
「記号」と言われてもいまいちピンと来ないんだが、何にせよ、
普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う
取り得る種類がコンパイル時に決まっているなら列挙型
そうでないなら整数とか文字列
文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか
578:デフォルトの名無しさん
08/08/22 22:34:03
>>576
>>310-314
579:デフォルトの名無しさん
08/08/23 09:45:26
>>572
Prologでも、
1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの
処理をしたりすると確かにアトムが大量発生するだろうが、
Stringとして読み込んで、終始String処理に徹すれば、アルファベットの
数、つまり高々数万のアトムで済むんじゃないの?
Stringすなわちリスト処理になると遅いから嫌なのかな。
580:デフォルトの名無しさん
08/08/23 10:00:27
宣言的言語をリアルタイム処理に使いたくない病にかかってる。
資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。
581:デフォルトの名無しさん
08/08/23 10:09:14
>>579
処理速度もあるかも知れませんが、アトムだと、
foo([株式会社|R],R).
と書けるところが、Stringだと
foo(List,R) :- append("株式会社",R,List).
と書かなくてはならないということがあります。
appendを高速化する機構が欲しくなりますね。
582:デフォルトの名無しさん
08/08/23 10:35:10
それって代数的データ型を使ってこんな感じで良いんじゃない?
data Atom = Kabushiki | Dummy deriving (Show, Eq)
foo :: [Atom] -> [Atom]
foo (Kabushiki : r) = r
583:デフォルトの名無しさん
08/08/23 11:43:27
Prologでまったり Part3
スレリンク(tech板)
584:デフォルトの名無しさん
08/08/23 12:43:04
>>581
この話おかしいよ。
foo([株式会社|R],R). の方は、
すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。
一方、
foo(List,R) :- append("株式会社",R,List). のListはString。ここは、
foo(["株式会社"|R],R).
でなきゃ、フェアじゃない。
585:デフォルトの名無しさん
08/08/23 13:58:45
>>572
> Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し
第五世代コンピュータプロジェクトの成果を是非参照下さい。
586:36 ◆K0BqlCB3.k
08/08/23 14:16:16
>>585
よく知らないけどソフトウェア科学会会誌7月号に第五の話題が載っていたよ
587:デフォルトの名無しさん
08/08/23 14:21:10
成果って、「prologって役立たずじゃん」という結論を得たこと?
588:36 ◆K0BqlCB3.k
08/08/23 14:28:53
>>587
それは短絡的な人たちの根拠のないうわさ。
第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。
589:デフォルトの名無しさん
08/08/23 14:31:33
Prologの話は他でやってくれ
んで問題点を整理してまたいらっしゃい
590:36 ◆K0BqlCB3.k
08/08/23 14:33:31
詳しいことは忘れたけど、
述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。
なんだったっけ?
591:デフォルトの名無しさん
08/08/23 14:45:22
Prologはどうでもいいのだが、Haskellで金融(とくに保険業)のアブリを
開発する場合、何か問題になる点はないのか。
592:デフォルトの名無しさん
08/08/23 14:54:20
>>591
必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。
593:デフォルトの名無しさん
08/08/23 14:57:02
金融系システムにHaskellを使うメリット自体が思いうかばん。
いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。
どうせ枯れたシステムなんだから。
594:デフォルトの名無しさん
08/08/23 15:00:18
>>592
full lazyな処理系って、よくわからない。
595:36 ◆K0BqlCB3.k
08/08/23 15:11:43
どんな言語で書いたとしても、必要なメモリの量は実際に動かしてみないとわからないよ。
596:デフォルトの名無しさん
08/08/23 15:17:46
haskellっていいプロファイラあんの?
597:デフォルトの名無しさん
08/08/23 15:26:42
>>595
COBOLなんかは確定してると思うけど。
598:デフォルトの名無しさん
08/08/23 15:42:16
>>597
してない。
SORTなどに内部的に使う記憶容量が不明。
599:デフォルトの名無しさん
08/08/23 15:43:11
Haskellのようにデフォルトで遅延評価する言語は、
計算をできるかぎり遅延させようとするから、
下手な書き方するとすぐメモリリークする
Haskellのメモリリークは大抵の場合小規模な修正で直るけど、
どこを修正すべきか探すのに慣れとプロファイラが要る
>>596
GHC付属のプロファイラは優秀だと思う
600:36 ◆K0BqlCB3.k
08/08/23 15:47:59
>>596
profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。
詳しくはマニュアルで。
601:デフォルトの名無しさん
08/08/23 16:19:23
>>598
ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。
グラフ簡約のヒープ消費は予測もつかんぞ。
602:デフォルトの名無しさん
08/08/23 16:27:11
>>601
確定してるのかしてないのかどっちだw
603:初心者修業中
08/08/23 16:37:52
Haskellでメモリーリークが起きるのですか?
ガベージコレクションにバグがない限り、
メモリーリークが起きるとは思えないのですが…。
FFIを使った場合の事でしょうか…。
604:デフォルトの名無しさん
08/08/23 17:15:44
>>599 の例としては↓の話かな。
URLリンク(d.hatena.ne.jp)
この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、
期待した解放タイミングと実際のそれとのギャップの事みたいだね。
605:初心者修業中
08/08/23 17:42:49
これも「メモリーリーク」と呼ぶのでしょうか?
*Main> foldr (+) 0 [0..1000000]
*** Exception: stack overflow
606:デフォルトの名無しさん
08/08/23 18:05:58
プログラマが意図してないで、リファレンスが残るようなコーディングを
しちゃってる、というのをリークに含めることもある。
607:デフォルトの名無しさん
08/08/23 18:34:57
>>605
それは「マヌケ」と呼びます。
608:初心者修業中
08/08/23 18:57:56
stack overflowが発生する時、
簡単にわかる場合は「マヌケ」
ちょっとわかりづらい場合は「メモリーリーク」
と呼ぶという認識でよろしいでしょうか?
609:デフォルトの名無しさん
08/08/23 19:14:20
リークってのは「漏れ」のこと。
GCのある言語だと、>>606しか起こり得ない。
>>605の「溢れ」とは全然違う。
610:デフォルトの名無しさん
08/08/23 19:20:46
>>605
それはスタックオーバフロの例外であって、エラーとは違う。
メモリリークしているわけではないよ。
611:デフォルトの名無しさん
08/08/23 19:22:12
C言語みたいに型があいまいな言語ではメモリリークが起こりうるが、
Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー
612:デフォルトの名無しさん
08/08/23 19:26:56
スタックオーバーフローとメモリーリークは
現象として全然違うと言う事ですね。
分かります。
613:デフォルトの名無しさん
08/08/23 19:53:14
>599や>604が挙げているような例はC言語で
良く言われる「メモリーリーク」とは違う現象だな。
Haskellの場合、遅延評価がデフォーなので
うかつに再帰を使うと計算の途中結果が膨大な
ものになってヒープ領域が溢れてしまう。
Cの場合はただの確保したメモリの解放し忘れ。
Cでも再帰的なメモリー確保をすれば
Haskellみたいな事も起きうるはずだが。
614:デフォルトの名無しさん
08/08/23 20:06:48
>>611
強い静的型付けとメモリーリークの有無はほとんど関係がありません。
GCの方がずっと関係が深いです。
615:デフォルトの名無しさん
08/08/23 20:09:24
Pascalのnewとfreeだっけ?
あれ考えれば分かるよな。
強い型付けでも簡単にメモリーリークは起きる。
616:デフォルトの名無しさん
08/08/23 20:56:45
foldl でも stack overflow するんだよね。
Data.List.foldl' 使えばいいんだけど。
617:デフォルトの名無しさん
08/08/23 21:35:43
なんで foldl でスタック溢れるの?末尾再帰が最適化されてないの?
618:デフォルトの名無しさん
08/08/23 21:48:31
>>604のリンク先に書いてある
末尾再帰は最適化されるよ
619:初心者修業中
08/08/23 23:53:01
>>617
遅延評価だからと認識しています。
↓参考
URLリンク(haskell.g.hatena.ne.jp)
620:617
08/08/24 00:40:37
>>618-619
なるほど、非常によくわかりました。
(つーか前出のリンク読まずにレスして申し訳ない)
うーむ、しかし末尾再帰が最適化されることの旨みは、
・ローカルスコープの値をスタックに積む必要がなくなることと
・連続するreturnが省略されること
の2点だと思うけど、foldl のように結局は遅延評価のための
computation がスタックに積まれていて、後から順次簡約するなら
「最適化されている」とは言い難い気もするな・・・。
最適化するための然るべき変形は、一応してあるんだろうけど。
まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?
621:デフォルトの名無しさん
08/08/24 00:54:46
↓にも関連した話が載ってる。
URLリンク(itpro.nikkeibp.co.jp)
622:デフォルトの名無しさん
08/08/24 13:10:00
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?
■Wiki
URLリンク(www36.atwiki.jp)
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
URLリンク(ex14.vip2ch.com)
623:デフォルトの名無しさん
08/08/24 16:41:26
「特にErlang」…
実用性でいうとやっぱErlangなのかな…
624:デフォルトの名無しさん
08/08/24 18:20:21
>623
大規模なWebサービスを構築するのに向いていると
考えたから企画者がErlangを採用したんだろうね。
625:デフォルトの名無しさん
08/08/25 09:10:25
大規模な、ってのがクセ者で、
実情は単にDBのテーブルが大きいだけだったりするよな。
そもそもウェブアプリでDB以外どこが肥大化するよ?
626:デフォルトの名無しさん
08/08/25 09:11:28
画面?
627:デフォルトの名無しさん
08/08/25 09:20:29
>>625
複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。
それともデータサイズの規模に限定した話?
628:デフォルトの名無しさん
08/08/25 09:53:32
>>625
とりあえずErlang + YAWSの事例くらいは、
念頭においてくれないと、話にならないのでは?
629:デフォルトの名無しさん
08/08/25 09:55:11
>>627
> 複数のwebサービスから情報集めたり、
そういうのはAjaxでクライアント側がやるのが流行では?
まあサーバ側がやってもいいですが、HTTPセッションを入れ子にするのは
あまり筋がいい設計とは思えません。
> もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
まあDB接続なんかもそうですよね。
しかし「大規模になる」ような要因とはあまり考えられないのですが。
> 別プロセスで並列キューに入れて処理しなきゃいけなかったり、
fastcgiとかの話でしょうか?特段、だから大規模になるというものではないと思いますが。
> それともデータサイズの規模に限定した話?
コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。
630:デフォルトの名無しさん
08/08/25 10:00:08
>>629
> コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
> 用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。
よいCMS系フレームワークを、
容易に開発できるかどうかって話をしているんだと思いますよ。
631:デフォルトの名無しさん
08/08/25 10:54:21
>>630
なるほど、わかりました。
格納するコンテンツの量は結局DBのサイズの問題になると思うので、
それ以外の「大規模」の要因というと、
・同時接続数(パフォーマンス)
・登録ユーザー数
ぐらいでしょうか。
それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。
「学校」というドメインが明確になっているので、
一般のCMSフレームワークほど汎用化は要求されないし、
どのような要因でコードサイズが「大規模」化するのか興味があります。
632:デフォルトの名無しさん
08/08/25 12:22:00
>>624
Apacheとか使わずErlangでサーバー構築するんじゃないの?
633:デフォルトの名無しさん
08/08/25 12:26:39
キッチンシンクアプローチか……
634:デフォルトの名無しさん
08/08/25 13:01:50
Erlangをわざわざ使うということは、数百レベルの並列プロセスを
マルチコアで何とかしようと考えていると見て間違いない。
Webだとすれば、WebServer以外考え難い。生徒数千でほぼ
同時にアクセスがあるとか。
635:デフォルトの名無しさん
08/08/25 13:13:15
しかし、>>622 はなんでErlangスレに書いてないんだ?w
636:デフォルトの名無しさん
08/08/25 13:16:41
単に初期メンバーにErlang使いが居ただけなじゃいの?
637:デフォルトの名無しさん
08/08/25 13:16:52
Erlangスレ見たことない方ですねw
638:デフォルトの名無しさん
08/08/25 13:42:02
Erlangはどうでもいいんだけれど、
HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、
確保されているインターフェイスを介してHaskellで利用するというやり方は
多くなるんじゃないかな。短時間で開発する一手法としてね。
639:デフォルトの名無しさん
08/08/25 13:57:49
ならないね。
640:デフォルトの名無しさん
08/08/25 14:13:29
>>638 落日のPerlを使うかどうか。 規格書の通りに一からすべて開発するのは確かに大変だね。
641:デフォルトの名無しさん
08/08/26 00:21:14
Text/ParserCombinators/ReadP.hsとKoen Claessen氏のペーパーを読んで思ったんですが、
Haskellに慣れてくるとこの実装が直感的に見えてくるんですか?
Haskellのパーサコンビネータ関連のペーパーを読んでいない状態でReadPを読んで、
data P a = Get (Char -> P a)
略
| Result a (P a)
略 なのを「え、一番直感的じゃん」
とか、
newtype ReadP a = R (forall b . (a -> P b) -> P b)
で
instance Monad ReadP where
return x = R (\k -> k x) ← これとか
fail _ = R (\_ -> Fail)
R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k)) ← これとか
とか
get = R Get
ってなるを、「ああ、自明だなすげえ直感的」みたいに理解できるようになる物なんですかね。。難しすぎる。。。
642:デフォルトの名無しさん
08/08/26 00:29:58
>>629
大規模になる要因なんていくらでもあるじゃん。
今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。
分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。
何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。
学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。
まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。
643:デフォルトの名無しさん
08/08/26 01:08:51
といったって、googleも複雑なシステムとか言われてるけど、
googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。
台数は1台だけど自宅で似たようなことやってるもん。
644:デフォルトの名無しさん
08/08/26 08:11:38
>>641
P のような再帰的な型のモナドを、
効率のために継続モナド(ReadP)で包むのは定石。
Haskell への慣れっていうより、
モナドや継続モナドへの慣れの問題な気がする。
P は問題によって様々だけど、
ReadP のとこは Control.Monad.Cont の
一般的な継続モナドと(型を除いて)同じなので、
それを理解しておくと問題に集中できていいかもよ。
645:デフォルトの名無しさん
08/08/26 08:13:32
つ チラシの裏
646:デフォルトの名無しさん
08/08/26 08:21:08
>>642
それはバックエンドで動いている他プロセスが複雑なのであって
ウェブアプリが複雑なわけではないのでは?
647:デフォルトの名無しさん
08/08/26 08:32:48
>>625
機械翻訳とかではなくて?
648:デフォルトの名無しさん
08/08/26 18:38:57
>>644
どうもレスありがとうございました。
>P のような再帰的な型のモナドを、
>効率のために継続モナド(ReadP)で包むのは定石。
これは初めて聞きました。どうもありがとうございます。
確かに
If we want to build monads on top of a continuation based programming paradigm,
such as stream processors or continuation based I/O in Haskell,
we need to build a monad around the continuation based operations.
って書いてあるペーパーを見付けました、その継続ベースの方法について考えながら考えていこうと思います。
649:デフォルトの名無しさん
08/08/26 18:52:43
URLリンク(www.cs.chalmers.se) でしょ
650:デフォルトの名無しさん
08/08/26 19:00:04
>>649
そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。
例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。
651:デフォルトの名無しさん
08/08/28 06:47:20
>>648
P みたいなのを継続ベースともいうけど、
ReadP を使うのは純粋に効率のためで、
そこに書いてあるのとは話が違うような。
652:デフォルトの名無しさん
08/08/28 11:12:38
> 純粋に効率のためで
そう単純化されても…
653:デフォルトの名無しさん
08/08/28 14:48:42
いや、単純だし…
654:デフォルトの名無しさん
08/08/28 21:41:23
具体的にどういう場合にどうして効率が良くなるんですか?
ReadPだと、PがReadPで包まれてるわけだけど、
get' = Get return
look' = Look return
sat' p = do a <- get' ; if p a then return a else Fail
char' c = sat' (c == )
string' s = do str <- look' ; scan s str
where scan [] _ = return s
scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys
scan _ _ = Fail
みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。
URLリンク(www.cs.chalmers.se)
ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。
655:デフォルトの名無しさん
08/08/29 14:13:46
ReadPはdata宣言じゃなくてnewtype宣言だから、
記述上は包まれた形になってるけど、実装では包みが外れた形になる。
参照: URLリンク(haskell.g.hatena.ne.jp)
Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?
656:デフォルトの名無しさん
08/08/29 15:53:54
>>655
どうもありがとうございます。
実際にはReadPの所はR Get やR Lookなどが渡されることになりますよね。
そのあとすぐにrunで即Rはずしてますし。
>Pは直接的にはうまく束ねることができないから
これってどういう意味で仰ったんですか?
P を束ねてパーサとして使うことも、実際できる(>>654のget'など)のでわざわざどうしてReadPにするのか、
Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて
私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。
657:デフォルトの名無しさん
08/08/29 17:28:28
>>654
ReadP の計算で左結合になってる >>= がある場合でも、
内側の P の >>= をすべて右結合にすることで、
P の >>= の再帰が無くなって効率が良くなる。
9節の第1パラグラフに書いてある通りなんだけど。
左結合を右結合にってのは、>>= の結合則
(m >>= f) >>= g == m >>= (\a -> f a >>= g)
の左辺を右辺にするってな話。
例えば、string s >>= f でも string s の中で
>>= を使ってるので、左結合になってる。
つまりほとんど全ての場合に当てはまる。
658:デフォルトの名無しさん
08/08/29 17:29:19
効率が悪くなる事情は、そこにも書いてあるようにリストの ++ と同じ。
リストの ++ は左引数に関して再帰する。
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
そのため (xs ++ ys) ++ zs は xs に関して二重に再帰することになる。
foldr (++) [] (map show [1..10000])
foldl (++) [] (map show [1..10000])
実際これらを実行してみると前者はすぐ終わるけど、後者は "1" を10000回結合、
"2" を9999回結合、... "10000" を1回結合、みたいになって遅い。加速してくけど。
遅いだけじゃなく、中間リストを生成するので無駄にメモリを使うことにもなる。
foldl は極端な例だけど、foldr も極端で、いつも無駄が無いようにはいかない。
659:デフォルトの名無しさん
08/08/29 17:30:18
で、回避策。
xs ++ ys は、xs の最後の [] を ys に置き換える。
それを効率よくやるには、最初っから [] なんか使わないで、
1:2:3:[] を \nil -> 1:2:3:nil みたいにしとけばいいじゃんという発想。
つまり [a] を [a] -> [a] に、xs を xs ++ に、++ を (.) にする。
こうしておくと、[] を与えてリストに戻すときには、
(.) が右結合になってなくても ++ は右結合になる。
(((xs ++) . (ys ++)) . (zs ++)) []
= ((xs ++) . (ys ++)) (zs ++ [])
= (xs ++) (ys ++ (zs ++ []))
= xs ++ (ys ++ (zs ++ []))
実際 String の ++ を頻繁に使う class Show あたりでは、
できるだけ type ShowS = String -> String を使うことになってる。
shows :: Show a => a -> ShowS を使ってさっきの
foldl (.) id (map shows [1..10000]) []
をやってみると、今度は問題無く速い。
660:デフォルトの名無しさん
08/08/29 17:31:29
で、ReadP。
m >>= f (P の >>=)は、m の最後の return a を f a に置き換える。
それを効率よくやるには、最初っから return なんか使わないで、
Get (\c1 -> Get (\c2 -> return [c1,c2])) を
\k -> Get (\c1 -> Get (\c2 -> k [c1,c2])) みたいにしとけばいいじゃんという発想。
つまり P a を forall b. (a -> P b) -> P b に、
m を m >>= に、>>= を \m f k -> m (\a -> f a k) にする。
以下略。
661:デフォルトの名無しさん
08/08/29 17:32:22
で、余談。
foldr c n xs は、xs の : を c に、[] を n に置き換える。
それを効率よくやるには、最初っから : や [] なんか使わないで、
1:2:3:[] を \c n -> 1 `c` 2 `c` 3 `c` n みたいにしとけばいいじゃんという発想。
つまり [a] を forall b. (a -> b -> b) -> b -> b にする。
リストに戻すときは build xs = xs (:) [] を使う。
すると foldr c n (build xs) ==> xs c n と変換できる。
map f xs <==> build (\c n -> foldr (c . f) n xs)
例えばこういう変換を定義すれば、
(map f . map g) xs = map f (map g xs)
==> build (\c n -> foldr (c . f) n (build (\c n -> foldr (c . g) n xs)))
==> build (\c n -> (\c n -> foldr (c . g) n xs) (c . f) n)
==> build (\c n -> foldr (c . f . g) n xs)
==> map (f . g) xs
のように map f . map g ==> map (f . g) という変換ができる。
map f . map g 以外にも、他のいろいろなリスト関数の
foldr/build を使った形への変換を定義しておけば、いろいろな変換ができる。
foldr/build による融合変換ってやつ。今の GHC もこれを使ってる。
詳しくは GHC User's Guide の 8.13. Rewrite rules あたりを見てくれ。
662:デフォルトの名無しさん
08/08/29 18:19:15
>>657-661
とても分かりやすい解説どうもありがとうございます!
ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。
とてもご丁寧にありがとうございました。
流石だ。。。
663:デフォルトの名無しさん
08/08/30 18:34:32
Haskellが宣言型言語とか最初に言い出したのは誰なのかしら
664:デフォルトの名無しさん
08/08/30 18:44:45
imperative language ←→ declarative language の対比で
ごく自然発生的なものだと思うが?
665:デフォルトの名無しさん
08/08/31 00:07:29
宣言型言語 = what(何をしたいか)を記述
手続き型言語 = how(どうやるか)を記述
クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな
666:デフォルトの名無しさん
08/08/31 00:38:36
>>665
宣言型言語=述語論理を記述
と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。
667:デフォルトの名無しさん
08/08/31 03:38:00
>>665
> クロージャをいかに早めに潰すかに苦心
ってどういうこと?
668:デフォルトの名無しさん
08/08/31 09:45:13
>>667
関数のインライン展開のようなものじゃないか
よく分からんが
関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする
だからどう書くか (how) を工夫する
人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる
というのは
素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず
669:デフォルトの名無しさん
08/08/31 15:47:12
計算資源が有限なため、howが分からないとwhatも記述できないという罠
670:デフォルトの名無しさん
08/08/31 15:59:09
本質的には what -> how の書き換えと how -> how の最適化は似たようなもんだからな。
最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。
LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。
671:デフォルトの名無しさん
08/08/31 17:18:22
>>667
>>600前後の流れ参照
要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある
672:デフォルトの名無しさん
08/08/31 20:51:42
しかし、そんなこと言ってたらprologだって宣言型と言えなくなるんじゃない?
673:デフォルトの名無しさん
08/08/31 21:42:38
お前らは
人間の性格はA型B型O型AB型の4種類に分けることができる
とか思ってそうだよな。
674:デフォルトの名無しさん
08/08/31 23:36:24
なんでも過不足なく分類できると思い込む愚かさ
血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ
どっちをさしてるのか紛らわしいので例としては不適
675:デフォルトの名無しさん
08/09/01 01:06:10
>>674
おもしろおかしい
676:デフォルトの名無しさん
08/09/01 07:57:32
URLリンク(www.realworldhaskell.org)
書き終わったって。
677:デフォルトの名無しさん
08/09/01 15:40:49
zipで(ry
678:デフォルトの名無しさん
08/09/02 14:15:50
>>666 プ
試しにZあたりの実行系でもつくってみればw
679:デフォルトの名無しさん
08/09/02 17:56:25
>>678
何が言いたいのははっきり言え。
小馬鹿にするだけでは情報価値ゼロだぞ。
680:デフォルトの名無しさん
08/09/03 08:50:51
述語論理なめんな、ってことじゃね?
せめてホーン論理に限定するとかじゃないと話にならんだろ。
681:デフォルトの名無しさん
08/09/03 23:53:10
関数とKleisli以外のメジャーなArrowってあるの?っていうかArrowって死滅したの?
682:デフォルトの名無しさん
08/09/04 00:04:13
>>676
おお!でも英語疲れる。訳書出版の予定はないの?
683:デフォルトの名無しさん
08/09/04 01:25:52
>>681
死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。
684:デフォルトの名無しさん
08/09/04 11:41:24
このスレって嘘多いよな。
685:デフォルトの名無しさん
08/09/04 12:00:02
このスレって〜
ってレス多いよな。
686:デフォルトの名無しさん
08/09/04 15:00:58
そういえば、大学入試のときに大学ランクとタバコの関係に気づかされたなぁ・・・
東大 誰も吸っていない
京大 誰も吸っていない
同志社大 ちらほら
関西大 校舎内で吸っているやつがいる(!!!)
ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・
687:デフォルトの名無しさん
08/09/04 15:19:00
そして増える意味不明なレス
688:デフォルトの名無しさん
08/09/04 15:20:04
>>684
素人なのでどの変がうそなのか教えてください
689:デフォルトの名無しさん
08/09/04 15:45:52
686みたいな奴がhaskellを使うとはとても思えんのだが、
何しに来てるのかね?
690:デフォルトの名無しさん
08/09/04 15:50:35
>>689
Haskellがどういうものだと思っているんですか?
691:デフォルトの名無しさん
08/09/04 17:36:25
>>686は今マルチされてるコピペ、スルー推奨です。
692:デフォルトの名無しさん
08/09/04 19:33:03
>>690
全角数字を見るといらっとくる人が使う言語
693:デフォルトの名無しさん
08/09/04 19:35:16
確かにイラっときた
694:デフォルトの名無しさん
08/09/04 21:21:38
>>693
それはカルシウム不足
695:デフォルトの名無しさん
08/09/06 23:15:53
Haskellで良いコード綺麗なコードというのはどんなコードですかね。
出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。
696:デフォルトの名無しさん
08/09/06 23:55:28
>>695
y f = f (y f)
697:デフォルトの名無しさん
08/09/07 00:05:33
>>695
haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。
698:デフォルトの名無しさん
08/09/07 00:12:32
良いコード:
意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport
699:デフォルトの名無しさん
08/09/07 00:15:18
っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。
>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?
700:デフォルトの名無しさん
08/09/07 00:33:20
単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。
複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。
701:デフォルトの名無しさん
08/09/07 00:34:19
>>699
圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5213日前に更新/225 KB
担当:undef