関数型プログラミング ..
[2ch|▼Menu]
446:デフォルトの名無しさん
08/01/16 19:00:45
>>445
なぜか$!に慣れないのでseqを使ってるけど

toBaseN_loop_case :: Integer -> Integer -> [Integer]
toBaseN_loop_case n 0 = [0]
toBaseN_loop_case n x = f x []
  where
    f 0 ds = ds
    f x ds = case divMod x n of
      (r, q) -> f r (q:ds)

toBaseN_loop :: Integer -> Integer -> [Integer]
toBaseN_loop n 0 = [0]
toBaseN_loop n x = f x []
  where
    f 0 ds = ds
    f x ds = let q = div x n; r = div x n in
      q `seq` r `seq` f r (q:ds)

447:デフォルトの名無しさん
08/01/16 19:22:34
今気付いたけど、toBaseN_loopのdivは片方modじゃないといかんな
そういうわけで>>444の結果は間違ってる

448:デフォルトの名無しさん
08/01/17 19:16:16
たかだか有限時間で終わる処理について実行効率など考える必要はない

449:デフォルトの名無しさん
08/01/17 19:17:04
神様キター!

450:デフォルトの名無しさん
08/01/17 21:31:07
>>448
人間が不快に感じるかどうかなんて些細な問題だよな

451:デフォルトの名無しさん
08/01/17 22:19:48
だったら数学やっててくれ。

452:デフォルトの名無しさん
08/01/18 00:05:36
>>448
512ビットの素因数分解だって有限時間でできますよ。

453:デフォルトの名無しさん
08/01/19 03:21:02
>>448
お前の人生も有限時間で終わるぜ

454:デフォルトの名無しさん
08/01/19 10:02:31
この宇宙は有限時間で終わりますか?

455:デフォルトの名無しさん
08/01/19 18:40:07
どなたか
State モナドの使い方を
教えて貰えませんか?

456:デフォルトの名無しさん
08/01/19 18:58:23
使いどころが知りたいのか書きかたが知りたいのか

457:デフォルトの名無しさん
08/01/19 19:20:13
>>455
例が腐るほどWEB上にあるだろ
検索してみろよ

458:デフォルトの名無しさん
08/01/19 19:22:47
使いどころです。

459:デフォルトの名無しさん
08/01/19 19:34:18
>>458
入門書に載ってた例だけど、

・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、


460:459
08/01/19 19:40:19
途中送信御免

例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。

手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。

461:デフォルトの名無しさん
08/01/19 21:49:50
広範囲で変数を持ちまわるのに
普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、
そんなどこで変更されるかわからないようなアブナイことしなくても
(a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、
普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?

462:デフォルトの名無しさん
08/01/20 08:17:57
>>461
「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。

463:デフォルトの名無しさん
08/01/20 19:37:59
>>460
禿言うなヽ(`Д´)ノ

464:デフォルトの名無しさん
08/01/20 20:55:16
>>460
hageにも人権をヽ(`Д´)ノ

465:デフォルトの名無しさん
08/01/22 10:36:58
(("nukege") "usuge" (("fuga") "usuge" ("fuga")))

466:デフォルトの名無しさん
08/01/23 15:17:31
オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、
いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・

467:デフォルトの名無しさん
08/01/23 15:44:00
>>466
よく使われるのは1次元配列とbit board

468:デフォルトの名無しさん
08/01/24 12:50:26
ByteStringでのParsec実装が欲しいっす。

469:デフォルトの名無しさん
08/01/24 19:11:50
そういえばParsecがどうやって実装されてるか知らない
ソース見てみたけど何か難しそうだ

470:デフォルトの名無しさん
08/01/24 23:03:19
普通にモナドじゃないの?

471:デフォルトの名無しさん
08/01/29 13:51:05
log4*的なロガーライブラリってないでしょうか?

472:デフォルトの名無しさん
08/01/29 13:58:35
>>471
実際に使ったことはないけど
URLリンク(hackage.haskell.org)

473:デフォルトの名無しさん
08/01/29 14:11:30
>>472
おお!ありがとうございます。
試してみます

474:デフォルトの名無しさん
08/01/30 15:37:30
質問です。

C言語で
int hoge(void) {
int x,i;
for(x=0, i=0; i<100000; i++) {
x=x+i;
}
return x;
}
をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。

475:デフォルトの名無しさん
08/01/30 16:03:59
まるで最低一種類は自力で書けるかのような言い方だな

476:デフォルトの名無しさん
08/01/30 16:09:44
どんな場合にも一番いい方法が存在するかのような言い方だな

477:デフォルトの名無しさん
08/01/30 16:16:33
>>474
俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな

478:474
08/01/30 16:19:09
>>477
ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?

479:デフォルトの名無しさん
08/01/30 16:29:10
>>478
どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第

480:474
08/01/30 16:34:17
>>479
ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?

481:デフォルトの名無しさん
08/01/30 16:50:17
>>480
> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk

482:デフォルトの名無しさん
08/01/30 16:52:05
>>480
処理系と最適化オプションに依る

素朴な遅延評価だと前者
sum [0..100000]
==> foldl (+) 0 [0..100000]
==> foldl (+) 0 (0:[0+1..100000])
==> foldl (+) (0+0) [0+1..100000]
==> foldl (+) (0+0) (1:[1+1..100000])
==> foldl (+) (0+0+1) [1+1..100000]

==> foldl (+) (0+0+1+2+...+100000) []
==> 0+0+1+2+...+100000


だけど、例えばghc-6.8.2で-O2だと、Integer用に特殊化されたsumの実装が使われて、
foldlの蓄積引数が積極評価されるので後者になる

483:482
08/01/30 17:08:24
分りにくい気がしたので補足

どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの

484:474
08/01/30 17:08:53
>>482
ありがとうございます。
とても参考になりました。

485:デフォルトの名無しさん
08/01/30 17:56:59
イータ簡約って奴でしょ。
URLリンク(www.lambda-bound.com)

486:デフォルトの名無しさん
08/01/30 18:22:54
質問です。

URLリンク(sourceforge.net)
で6.8.1用のwxHaskellをダウンロードしてインストールし、
Windows XPでwxHaskellのサンプル(Minimal.hs)を
ghc --make Minimal.hs
としてコンパイルしてみたのですが、
出来上がったMinimal.exeをエクスプローラからダブルクリックで実行すると
目的のウインドウとコマンドプロンプトのウインドウの両方が表示されてしまいます。
コマンドプロンプトのウインドウはとても邪魔なのですが、
これが表示しないようにするにはどうすればよいのでしょうか?
さらに、実行ファイルを配布する際にDLLを付属するのは格好が悪いので、
DLLを使わないコンパイル方法はないものでしょうか?

487:486
08/01/30 18:29:59
前者の問題は過去スレを検索して解決できました。
コンパイルオプションに-optl-mwindowsをつければよいのですね。
早とちりしてすみません。

後者の方はまだ解決していません。

488:486
08/01/30 19:01:48
ファイルがめちゃくちゃでかくなると思っていろいろ調べたのですが、

URLリンク(e.tir.jp)
> よく読んだら、「余分なデータの削除なるオプションで500KB弱になった」と書いてある。それらしいオプションは……
>
> --overlay=strip strip any extra data attached to the file [DANGEROUS]
>
> なんか、「DANGEROUS」って書いてあるんだが。

とありますが、ghc6.8.1ではそのオプションは削除されています。

URLリンク(e.tir.jp)
> stripと言えば、binutils付属のstripコマンドもあった。
> ...
> strip -s hsddd01.exe
> 2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。

この方法はマニュアルの
URLリンク(www.haskell.org)
に言及されていました。

-funfolding-use-threshold0
というオプションをMinimal.hsのコンパイル時につけると逆に若干ファイルサイズが増えました。

489:デフォルトの名無しさん
08/01/31 12:20:45
GHC6.8.2(Win)でbytestring-0.9.0.4をつかって
-profフラグ付でコンパイルしようとすると

Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4?

と出て失敗してしまいます。(profフラグをつけなければ成功します)
対処方ご存知の方いらっしゃいますか?

つか、ByteStringに変更してさらに遅くなった俺涙目

490:デフォルトの名無しさん
08/01/31 17:57:26
>>488
その--overlay=stripはupxのオプションだろ

>>489
そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない

491:デフォルトの名無しさん
08/02/01 02:37:31
質問です。

windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか?
ロックがかかったままのファイルに書き込みする必要があるのです。

492:489
08/02/01 12:44:40
>>490
なるほど、ありがとうございます。
-p付でインストールしなおしてみます。

493:デフォルトの名無しさん
08/02/03 17:41:55
% cat hello.hs
main = putStrLn "こんにちは、世界!"

% ghc hello.hs -o hello
% ./hello
...... ←[ここは文字化け]

UTF-8でソースを書いて、コンパイル&実行したのですが、
文字化けします。

ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、
UTF-8は使えないのでしょうか?
コンパイルオプションが必要ですか?

494:デフォルトの名無しさん
08/02/03 18:05:27
>>493
>>5-6参照

495:492
08/02/03 18:44:28
>>493
どうもありがとうございます。
調べてみます。

496:デフォルトの名無しさん
08/02/03 21:46:49
>>469
ふつケルの終わりのほうに超簡易Parsec実装の解説がある。

497:デフォルトの名無しさん
08/02/05 12:00:00
do記法がどのように(>>=)変換されているのかがよくわからないです。
たとえば
do { a <- return 1; Just 2 }

return 1 >>= (\a -> Just2)
なのはぎりぎりわかったような感じですが
3つ以上
do { a <- return 1; Just 2; return a }
だとどうなるのでしょうか?

498:デフォルトの名無しさん
08/02/05 12:13:23
仕様を読めれば仕様を読むのが一番早い

499:デフォルトの名無しさん
08/02/05 12:29:01
>>497
最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a

500:497
08/02/05 12:31:43
>>499
なるほど!ありがとうございます!

501:デフォルトの名無しさん
08/02/06 15:33:19
>>500
do { a <- return 1
  ; Just 2
  }
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;

502:デフォルトの名無しさん
08/02/08 00:28:19
Haskell でも型のキャスト出来るんかね
リファレンス見てたらそれっぽいのが・・・。


503:デフォルトの名無しさん
08/02/08 00:31:47
>>502
(1::Int32)

504:デフォルトの名無しさん
08/02/08 11:53:24
>>503
キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない

505:デフォルトの名無しさん
08/02/08 16:20:26
ダウンキャストに相当するのがあるのか。

506:デフォルトの名無しさん
08/02/08 20:12:04
unsafeCoerceはどうよ?

507:デフォルトの名無しさん
08/02/08 20:26:50
>>506
忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの

508:デフォルトの名無しさん
08/02/09 14:13:19
ふつうのHaskell読み終えて、WikiBookとか眺めてるんですけど、ある程度まとまった
Haskellプログラムの実例が載ってる本というと、Craftになりますか?

ちょっと高価な本なので、買おうか迷ってます。

509:デフォルトの名無しさん
08/02/11 15:35:27
>>94-96
URLリンク(research.microsoft.com)
4.4 Declaration style vs expression style

510:デフォルトの名無しさん
08/02/15 19:30:20
Kleisliってなんて読むの?

511:デフォルトの名無しさん
08/02/15 19:31:04
クライスリーじゃないの?

512:デフォルトの名無しさん
08/02/15 19:33:20
>>510
クレイスリ

513:デフォルトの名無しさん
08/02/15 20:04:55
クレイスリ に一致するページは見つかりませんでした。

514:デフォルトの名無しさん
08/02/15 20:32:57
クライスリーだって該当する記述が2chしかないじゃないかよ。

515:デフォルトの名無しさん
08/02/15 20:35:58
とりあえずドイツ語っぽい綴りを
ドイツ語の規則に従って読んでる点で
クライスリーの方が信憑性はある

516:デフォルトの名無しさん
08/02/15 20:39:36
TeXをテックと読むのはおかしいですか
Linuxをライナックスと読むのはおかしいですか

517:デフォルトの名無しさん
08/02/15 20:43:06
おかしい

518:デフォルトの名無しさん
08/02/15 20:44:15
↑でもそういう風に読んでる人結構いるよ

519:デフォルトの名無しさん
08/02/15 20:45:10
大団円を大円団と勘違いしている人は
それはそれで正しいと申すか

520:デフォルトの名無しさん
08/02/15 20:46:27
俺、小さいころミートボールとゲートボールの違いが分からなかった

521:デフォルトの名無しさん
08/02/15 20:47:54
>>516
これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。

522:デフォルトの名無しさん
08/02/15 20:48:09
英語っぽっくウィヌックスで

523:デフォルトの名無しさん
08/02/15 21:34:53
クライスリーでおk?

524:デフォルトの名無しさん
08/02/15 21:43:55
別に何でもOK

525:デフォルトの名無しさん
08/02/15 21:44:19
数学板で聞いてみたら?

526:デフォルトの名無しさん
08/02/15 22:15:00
エルアイエヌユーエックスって読んでた・・・

527:デフォルトの名無しさん
08/02/15 22:28:35
URLリンク(dev.ariel-networks.com)

頭の悪いHaskell厨増殖しすぎwwwwwwww

528:デフォルトの名無しさん
08/02/16 08:55:10
>>527
Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw

529:デフォルトの名無しさん
08/02/17 21:01:38
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
URLリンク(www.nicovideo.jp)

伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」

伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」

後藤「.........ウザい」

二人「キャッハハハハハwwwww」

伊藤「ちょほんとさあ、大丈夫?www」

後藤「おい天使、おいおい自称天使ww」

伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」

後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」

伊藤「それかもう日本出て行ったらいいんじゃないの?www」

後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」

伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」

後藤「コワイヨーwwwコワイヨーwwwww」

二人「クックックックwwww」

530:デフォルトの名無しさん
08/02/18 09:51:50
Haskellのようなピュアな言語じゃ薄汚れた現実世界のアプリは書けないと言いたいのか?

531:デフォルトの名無しさん
08/02/18 12:06:05
>>530
ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。

532:デフォルトの名無しさん
08/02/18 12:16:09
別にffiも変なことしなけりゃ純粋さを壊さないだろ

533:デフォルトの名無しさん
08/02/18 12:28:40
>>532
おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。

534:デフォルトの名無しさん
08/02/18 12:39:56
まあそうだ
でも一々「ほぼ純粋な関数型言語」とか言うのか?

535:デフォルトの名無しさん
08/02/18 12:48:31
いや、ただの関数型言語だよ。
純粋なんて言葉をつけるのはおこがましい。

536:デフォルトの名無しさん
08/02/18 12:52:23
いや、でも滅多に副作用を使わないのは事実だし、重要な特徴じゃん

537:デフォルトの名無しさん
08/02/18 12:57:12
「モナディックI/Oを採用した関数型言語」でいいんじゃね

538:デフォルトの名無しさん
08/02/19 08:11:48
HaskellによるHaskellのための開発環境Leksah 0.1
URLリンク(builder.japan.zdnet.com)

539:デフォルトの名無しさん
08/02/19 11:08:19
副作用無しでなんでもできれば純粋ってことでいいんじゃね。
SchemeやMLは副作用無しじゃI/Oができないし。

540:デフォルトの名無しさん
08/02/20 12:44:17
また公式落ちてるぞ
よく落ちる糞公式だな

541:デフォルトの名無しさん
08/02/21 21:11:23
LuaってHaskell系だったのか
スレリンク(dtm板:216番)

542:デフォルトの名無しさん
08/02/21 21:29:53
そのスレで既に十分突っ込まれてるじゃないか

543:デフォルトの名無しさん
08/02/21 22:42:17
haskellのプログラムは巨大化する傾向があるようですが、
Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?

544:543
08/02/21 22:43:03
すみません、言葉足らずでした。
haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。

545:543
08/02/22 20:08:04
とりあえず1/10ぐらいのサイズにしたいのです。

546:デフォルトの名無しさん
08/02/22 21:22:26
Cだって大きなプログラム作れば大きいだろ。

547:デフォルトの名無しさん
08/02/22 21:29:57
とりあえず
・GHCの最新版を使う
・最適化オプションを有効にする
・strip
くらいじゃないか?
あとUPXとかで圧縮するのが有効というのを読んだ

548:543
08/02/22 22:16:46
>>546
論外

549:デフォルトの名無しさん
08/02/23 00:47:37
昔のGHCならCのソース出力するオプションがあったらしいんだが,今はないのか?
そもそもなんで実効ファイルが巨大化するのか調べた上での質問なら答えは直ぐに見つかるんだけどな

550:デフォルトの名無しさん
08/02/23 00:49:21
現状ghcではruntimeだけで200KBくらいになってしまうので無理かと。
jhcとかyhcならば判らないですけども。


551:デフォルトの名無しさん
08/02/23 08:40:01
libcや基本DLLよりずっと小さいよ。

Windowsの場合は、サードパーティが使える標準配布方式がないから、
静的リンクするか、インストーラー配布形式が必要になって、
それでこういう質問が増えるんだろうね。

お決まりの開発環境を使わないと、配布しづらい。

552:デフォルトの名無しさん
08/02/23 13:39:30
ghc だって libc に依存してるんでしょ

553:デフォルトの名無しさん
08/02/23 17:07:48
C++だってhello worldでもバカ正直にスタティックリンクすれば何百KBとかなったりするじゃん
ダイナミックリンクでごまかしてたりするけど
機能持たせた言語の実行ファイルサイズが膨らむのはトレードオフ

554:デフォルトの名無しさん
08/02/24 07:49:13
Craft買って読んでますが、練習問題の解答ってどっかにありますでしょうか。

555:デフォルトの名無しさん
08/02/24 12:24:26
以前、IOモナド関連部分の回答を適当なワードでググった時はヒットしたよ
10分くらい探したけど

556:554
08/02/24 19:38:46
つまり、ちゃんとした解答集のようなものは無いっちゅう
ことですかorz

そんな難しいものも少なそうなのでいいのかな

557:デフォルトの名無しさん
08/02/24 19:51:21
>>556
現状では、ある程度関数型言語でのプログラミングの経験をつんだ人が
Haskellを触るという感じなので、
言語仕様を見たらわりとすぐに使えるという人向きの文書しか出回っていない。
そういう意味では初心者はとっつきにくいかもしれないね。

558:デフォルトの名無しさん
08/02/24 20:19:53
また公式が落ちてやがる!!!!!!!!
なめやがって!!
マジ切れそうだ

559:デフォルトの名無しさん
08/02/24 20:47:32
すみません、こちらのファイアウォールのせいで公式につながらなかっただけでした・・・
お騒がせしました

560:デフォルトの名無しさん
08/02/24 22:59:49
>>558-559
wwwwwwwww


561:デフォルトの名無しさん
08/02/25 01:50:16
wwwwwwwwwww

562:デフォルトの名無しさん
08/02/25 01:58:36
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

563:デフォルトの名無しさん
08/02/25 02:08:33
URLリンク(www.blue.sky.or.jp)

564:デフォルトの名無しさん
08/02/25 20:06:50
大卒で正社員じゃない奴ってこのスレに多そうだなw
知ってるか?高卒の生涯賃金って高卒の半分なんだぜwww_?
中卒なんてもってのほか
可哀想にお前ら
そんな俺はもう内定貰ってこのスレいますけどねw

565:デフォルトの名無しさん
08/02/25 20:18:49
あいぉ(^ω^
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? 


566:デフォルトの名無しさん
08/02/25 20:20:52
>高卒の生涯賃金って高卒の半分なんだぜwww_?

再帰的ですねwwwwww

chingin x = chingin x / 2
こんな所でしょうか。

ちなみにスタックオーバーフローしましたが何か。

567:デフォルトの名無しさん
08/02/25 20:22:51
ちなみにこれね
スレリンク(gline板)

568:デフォルトの名無しさん
08/02/25 20:26:57
どうやら釣られてしまったようだ。。。

569:デフォルトの名無しさん
08/02/25 20:43:02
>>566
せっかくHaskellなんだから
chingin = chingin / 2
でいいよ
解は0とNaNと±Infと⊥だな

570:デフォルトの名無しさん
08/02/25 21:39:37
Nan = NanはFalseなんじゃないの?

571:デフォルトの名無しさん
08/02/26 10:33:53
何を言っているのかね

572:デフォルトの名無しさん
08/02/26 15:30:47
やってみた。
> 0/0
NaN
> 0/0 == 0/0
False
> 1/0
Infinity
> 1/0 == 1/0
True
> 1/0 == 1/0/2
True


573:デフォルトの名無しさん
08/02/26 15:32:37
⊥なんて解で出てくるの?

574:デフォルトの名無しさん
08/02/26 17:18:37
>>573
undefined

undefined / 2
は、どっちも同じ結果になる

575:デフォルトの名無しさん
08/02/28 14:35:34
関数型言語関連で購読おすすめのブログをいくつか教えてください

576:デフォルトの名無しさん
08/02/28 15:44:34
>>575
このスレ的にはここ
URLリンク(planet.haskell.org)

577:デフォルトの名無しさん
08/02/29 21:06:53
haskellerの皆さんって、元々はSchemeとか使っていたんでしょうか?

自分、関数型はハジメテでちょっと戸惑いがあったんですが、SICPを読んでみたら
何か分かってきました。

Haskellは今のところそういう文脈というか、経緯を知っている人たち向けってこと
なんでしょうかね。

578:デフォルトの名無しさん
08/02/29 21:12:23
俺はC++から入った
他の関数型は、SML入門をちょっとwebで読みあさった経験しかなかった

579:デフォルトの名無しさん
08/02/29 23:45:49
Common Lisp -> OCaml -> Haskell

580:デフォルトの名無しさん
08/02/29 23:54:20
WebProg -> Haskell

581:デフォルトの名無しさん
08/03/01 00:03:12
C++ -> Haskell (あまりのパラダイムの違いに混乱中)

582:デフォルトの名無しさん
08/03/01 01:50:01
>>581
C++のconcept(次の標準で入る)とHaskellのtype classは同じ。

自分は
雑多なLisp→Common Lisp→Miranda, CLOS, ML, C++→Haskell, Scheme, C++

583:デフォルトの名無しさん
08/03/01 02:00:01
>>577
そうですね。
関数型言語での再利用とオブジェクト指向言語での再利用では
毛色が全く違うので戸惑うでしょうね。

584:デフォルトの名無しさん
08/03/01 02:03:51
関数型言語といっても、遅延評価が入るだけでかなり質が変わってきますよ。
LispやMLの方がCプログラマには分かりやすいでしょう。

585:デフォルトの名無しさん
08/03/01 02:20:11
>>577
Haskellはそういう知識を得ることが楽しい人向けの言語。
先に知っていても、必要だと思ってそこで勉強しても、どっちでもいいと思う。
まあとにかく世界の広がる言語だと思う、Haskellは。
Schemeも面白い。

586:デフォルトの名無しさん
08/03/01 02:25:30
モナドを学ぶのにオススメの書籍やwebサイトはありますか
一応一通り検索して解説を読んでみたんですがいまいち概念を把握できてないです

使う分には困らないんですが

587:デフォルトの名無しさん
08/03/01 11:56:49
>>586
圏論の基礎

588:デフォルトの名無しさん
08/03/01 12:12:57
>>586
>>421


589:デフォルトの名無しさん
08/03/01 15:05:15
母:順へ げんきですか。いまめーるしてます

順:うるさい死ね メールすんな殺すぞ

母:ごめんね。おかあさんはじめてめーるしたから、ごめんね

順:うるさいくたばれ、メールすんな

母:ちゃんとご飯食べてる? お金送りましょうか?

順:うんありがとう。かあさんこそ体とか大丈夫?

590:577
08/03/01 19:22:00
なるほど、やはりLispからの方が多いんでしょうかね。

自分はLisp系知らずにHaskellやろうとして、map、fold、zipWithなどのリスト操作が
最も基本的なものとして扱われているのがピンときませんでした。

色々文書読んだりした後で、SICPを読んでみたら凄い分かってきましたよw。どうも
そういう文脈にある人々向けにドキュメントなどが作成されているなぁと。JavaやC#
とかが、C、C++の文脈を知っている人向けのドキュメントが多いのと同じでしょうかね。

591:デフォルトの名無しさん
08/03/02 01:21:53
map, reduceは他の言語でも、
コレクション周辺でサポートされてるよね?
ただgeneric function系じゃないと、
ちょっと趣きが違うから戸惑うのかも知れないが。

592:デフォルトの名無しさん
08/03/02 04:50:00
>>590
まず、今までループで処理してたところを全部再帰で考え直してみようよ。
再帰処理の部分を一般化して関数にできないかどうか考えてみようよ。

593:デフォルトの名無しさん
08/03/02 04:50:39
SICPってMITの1年生用の教科書でしょ?

594:577
08/03/02 08:02:16
>>591
ありますけど、理科系研究の実習用プログラムとかではない限り、あまり
使われないんじゃないかと思います。実際、言語の入門書類でも大きくは
扱われませんよね。

>>592
再起はそんなに戸惑いはありませんでした。どちらかと言えばループが
手続きの部分として扱われるのに対して、関数型ではそういう書き方は
あまりしない(醜いコードとなる)ってことですね。

>>593
そうです。すごい良書だと思います。

595:デフォルトの名無しさん
08/03/02 10:43:26
>>594
> 実際、言語の入門書類でも大きくは扱われませんよね。

入門書は年々数が増えていっていると共に、
糞本の割合が増えていっているから、
入門書一般の常識はいまや非常識といっていい状態。
本格的に取り組む入門書は嫌われるから。

関数型言語、特に本場の本は良書が多くてそういう心配はないんだけど。

596:デフォルトの名無しさん
08/03/02 10:51:29
古くても良書とされている入門書を店頭にわかりやすく並べている
本屋の数は、日本に人間の指の数ぐらいしか無いんではなかろうか。
他は次々と出る駄本の新刊を並べてるだけ。

597:デフォルトの名無しさん
08/03/02 10:53:22
Rubyなんかだとmapやinjectを使うのが当たり前かと思ったけど、そうでもないのか

598:577
08/03/02 11:26:03
>>595
自分はSICP読んで、何でもっと早くに手に取らなかったのか、と後悔してます。

>>597
Rubyのそういった機能は関数型由来のものですよね。C言語系列の手続き型
にはあまり登場しないんじゃないかと思います。

599:デフォルトの名無しさん
08/03/02 12:03:41
使えないand/or使いたがらないand/or嫌悪する奴もまたいますな

600:デフォルトの名無しさん
08/03/03 23:34:31
and と or って左結合?

601:デフォルトの名無しさん
08/03/06 13:53:14
THE HITCHHIKER'S GUIDE TO THE HASKELL 「HASKELL の歩き方」
URLリンク(ha6.seikyou.ne.jp)

web上の日本語の入門文書で、言語全体をカバーしてるのは初めてじゃないだろうか

602:デフォルトの名無しさん
08/03/06 18:12:31
>>601
なぜに自転車屋のホームページ?w
ラジオ部 って何?w

モナドに関して、あえて説明しないってのは、入門としてはありかもね。

603:デフォルトの名無しさん
08/03/06 23:38:42
Parsecを理解できる書籍って

普通のHaskellが妥当かな?

604:デフォルトの名無しさん
08/03/07 08:55:56
ひらがなで書かないと書籍名に見えないw

605:デフォルトの名無しさん
08/03/07 09:07:55
>>603
URLリンク(www.cs.nott.ac.uk)

606:602
08/03/07 13:57:47
よく見ると>>601って、
手続き言語的にHaskellを解説してるように思えるな…。

こういう入門書でHaskellを学ぶ人が多くなると、
オブジェクト指向の時みたいに混乱しそう…。

初心者のオレでも?なコードがある…。


607:606
08/03/07 15:35:46
あぁ!「?なコード」は
>>601 でなくて、>>601 で参照してる↓だった
関数型プログラミング言語 Haskell 早巡り
URLリンク(ha6.seikyou.ne.jp)



608:デフォルトの名無しさん
08/03/11 17:08:28
最近のライブラリはほとんどarrowベースになってるんだなぁ・・・

609:デフォルトの名無しさん
08/03/11 21:39:33
>>608
自分、Craft読み終えたばかりでモナドも入り口しか知らない…

道は遠いなぁ

610:デフォルトの名無しさん
08/03/15 18:58:13
ghcに-prof -auto-allを付けると最適化が弱まるのはいやがらせか?
フルに最適化の掛かったコードのプロファイルを取るにはどうすればいいんだ

611:デフォルトの名無しさん
08/03/15 19:14:50
>>610
最適化ありとなしなら違うだろうけどそれぐらいなら大差つきそうな感じもしないし
だいたいでいいんじゃない?

612:デフォルトの名無しさん
08/03/15 19:55:01
>>611
いや、一番内側のループにGHC.IOBase.>>の呼び出しやらunboxing/reboxingやらが残るんだ
もともと最適化で余計なものが全部消えることに期待しているソースなので、影響が大きい
実際、プロファイル版だと通常版の7倍くらい時間が掛かる
もちろんプロファイルのオーバーヘッドもあるだろうけど、別のソースだと3倍くらいで済むので、
最適化がうまく効かないことの要因が大きいと思う

613:デフォルトの名無しさん
08/03/17 13:44:15
wxHaskell 0.10.3 rc1が出てた。

614:デフォルトの名無しさん
08/03/17 16:47:24
wxHaskellをスタティックリンクする方法ありませんか?

615:デフォルトの名無しさん
08/03/18 09:56:50
Gtk2Hsと比べてどうなの?

616:デフォルトの名無しさん
08/03/18 21:37:58
ghc test.hs -o test
とやった時に生成される
test.hi
test.o
test.manifest
この3つのファイルを生成させなくする方法ってないですか?

617:デフォルトの名無しさん
08/03/18 21:52:22
>>616
manifestファイルの生成は-fno-gen-manifestで抑止できる
ただし多少の副作用がある。詳しくはマニュアル参照
oとhiの生成を止めるのは多分無理。これなしじゃ分割コンパイルできないし
ファイルが残るのが嫌なら、ghcを実行した後にoとhiを削除するスクリプトでも組めばいい

618:デフォルトの名無しさん
08/03/18 22:10:49
>>617
ありがとうございます
スクリプト書いて我慢することにします。

619:デフォルトの名無しさん
08/03/19 20:13:49
Introduction to Functional Programming Using Haskell
¥ 11,554 (税込)

ペーパーバックでこれって…。何でこんな高いの?

620:デフォルトの名無しさん
08/03/19 21:11:09
Bird大先生の書いた素晴らしい本なのでその価値はあります。
文章はもちろんコードが素晴らしいです。

621:デフォルトの名無しさん
08/03/19 21:19:32
>>619
需要と供給の関係じゃない?

622:デフォルトの名無しさん
08/03/19 21:33:24
>>621
Craftとかと比べるとあんまり売れ筋じゃないってこと?

623:デフォルトの名無しさん
08/03/19 21:47:52
>>619-620
「関数プログラミング(using Miranda)」はもっと安いYO!i

624:デフォルトの名無しさん
08/03/19 22:32:20
正直コードのぱっと見はSASL系のMirandaの方が好きだった。比Haskell

625:デフォルトの名無しさん
08/03/19 22:54:32
>>619
円高なんだから.comの書店から輸入すれば安いYO!

626:デフォルトの名無しさん
08/03/20 13:46:58
>>624
どの辺が違うの?

627:デフォルトの名無しさん
08/03/20 13:48:34
>>624
Mirandaスレ逝けYO!

628:619
08/03/20 13:57:36
っていうか、もう買っちゃったんだけどw

ついさっき届いたんだが・・・チョっw、Craftとかよりも紙が安っぽいwww

これ、11,554円か・・・。頑張って自分のモノにしないとなw

629:デフォルトの名無しさん
08/03/22 14:32:26
1966年にP.J.LandinがISWIMという言語を作ったのがその起源で、SASL, Mirandaという後継言語を経て、HaskellとCleanが生まれました。
これらは、全て「遅延評価」を評価戦略におくプログラミング言語であり、「純粋関数型言語」と呼ばれるグループです。

SASL系のMiranda???イミフ。

630:デフォルトの名無しさん
08/03/22 19:31:56
1954年にJ.BackusがFORTRANという言語を作ったのがその起源で, Algol, Cという後継言語を経て、C++とJavaが生まれました。
これらは、全て「副作用による状態の更新」を実行の基礎とするプログラミング言語であり、「手続き型言語」と呼ばれるグループです。

Algol系のC???イミフ。

631:デフォルトの名無しさん
08/03/22 19:39:51
wxHaskell 0.10.3 が出たみたい。
URLリンク(sourceforge.net)

632:デフォルトの名無しさん
08/03/22 23:22:00
遅延評価よりもしっくりくる言葉はないものだろうか
直訳で不精評価とか?

633:デフォルトの名無しさん
08/03/22 23:37:01
>>632


634:デフォルトの名無しさん
08/03/22 23:45:23
SASL系のMirandaって何?Haskellは何系なの?クワシク。

635:デフォルトの名無しさん
08/03/23 00:00:20
HaskellはMiranda系です

636:デフォルトの名無しさん
08/03/23 00:20:12
>>630 なにが意味不なのかわかんね

637:デフォルトの名無しさん
08/03/23 00:53:22
英語が難しくてよく理解できないのでつがw

638:デフォルトの名無しさん
08/03/23 10:58:06
>>629 なにが意味不なのかわかんね

639:デフォルトの名無しさん
08/03/23 11:43:24
Point-free styleで
\a b -> a*b + a/b
を書くにはどうすればいいですか?
一般に,同一の引数を複数回使うような関数はどう定義すればいいですか?
さらに例えば2引数a, bを取って,それらを複数回使い,
その場所が構文木の深さで並べたとき交互に入り混じるような関数はどう定義すればいいですか?
\a b -> a + exp(b + exp a)
みたいな.
* idとかを使って形式的に同じ深さにする(例えば snd(id b, id a) + exp(id b + exp a) とする)
* 2変数関数に同じ引数を与えるようなapplyをあらかじめ定義しておく
(そう言えばSコンビネータは S f g x => f x (g x) でxが2回出てくるなぁ...)
が鍵かなーと思ってますが,一般にはどうすればいいのか.

640:デフォルトの名無しさん
08/03/23 13:18:34
Control.MonadとControl.Monad.Instancesをインポートするとこの二つが使える
ap :: (a -> b -> c) -> (a -> b) -> a -> c
liftM2 (.) :: (a -> b -> c) -> (a -> d -> b) -> a -> d -> c
どっちも便利

641:デフォルトの名無しさん
08/03/23 13:51:22
s = \ x y z -> x z (y z)
k = \ x y -> x
i = \ x -> x
-- f = \ a b -> a * b + a / b
f = ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (+))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (*))))) ((s (k k)) i)))) (k i))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (/))))) ((s (k k)) i)))) (k i)))

642:デフォルトの名無しさん
08/03/23 14:37:06
返り値がユニットって他の言語で言うvoidの事ですか?

643:デフォルトの名無しさん
08/03/23 14:43:08
他の言語ってどの言語だよw

644:デフォルトの名無しさん
08/03/23 14:46:42
例えばcやJavaです

645:デフォルトの名無しさん
08/03/23 14:59:03
>>634
> SASL系のMirandaって何?

Turner大先生の作った言語がSASL→KRC→Miranda
URLリンク(en.wikipedia.org)

Mirandaは売り物じゃなければもっと普及したと思う。

646:デフォルトの名無しさん
08/03/23 19:45:21
>>642
全く違います。
Unitは値ですがvoidは値ではありません。

647:デフォルトの名無しさん
08/03/23 21:22:47
全く違いますか・・・
勉強しなおしますい

648:デフォルトの名無しさん
08/03/23 21:26:41
void 式は存在するし、C++ だと return 文にも渡せるが、
void 式を入れる変数が存在しない点が Unit とは大きく違う点か。

649:デフォルトの名無しさん
08/03/23 21:46:56
TAPLにはunitとCやJavaのvoidの使われ方は近いと書いてあるね。

650:デフォルトの名無しさん
08/03/23 21:57:00
使われ方は近いっていうのと概念が近いってのを混同せぬよう。

651:デフォルトの名無しさん
08/03/23 22:36:57
voidは引数として渡せないしな。

652:デフォルトの名無しさん
08/03/23 22:51:43
データ構造にも入れられない

653:639
08/03/24 00:09:11
>>640
Control.Monad.Instances って関係あるんですか?
つーか Control.Monad の ap や liftMn は (Monad m) => ... m a -> ... な感じでモナド専用なのでは?

>>641
トランスレータ乙w
Wikipediaに載ってる変換アルゴリズムには
> In general, the T[ ] construction may expand a lambda term of length n to a combinatorial term of length Θ(3n).
とありますが.
まぁSKIがあれば不可能な訳ではない,と...

R. Bird先生とかの論文で習うしかないのかなー

654:デフォルトの名無しさん
08/03/24 00:11:01
日本語でおk

655:デフォルトの名無しさん
08/03/24 00:19:18
instance Monad ((->) r) -- Defined in Control.Monad.Instances

656:デフォルトの名無しさん
08/03/24 01:13:02
lambdabotのplというプラグインが自動でポイントフリー変換をしてくれる
\a b -> a*b + a/b
を入れたら
ap (ap . ((+) .) . (*)) (/)
が返ってきた

\a b -> a + f (b + g a)
だと、
ap ((.) . (+)) ((f .) . (+) . g)

657:初心者修業中
08/03/24 04:17:08
あの、結局、ポイントフリーは

「クイズとしては面白いけど無理に使う必要はない」

という事ですよね?

658:デフォルトの名無しさん
08/03/24 07:52:47
当然だ
使うに値すると思ったときだけ使えばいい

659:デフォルトの名無しさん
08/03/25 04:01:38
Birdの一派は「ポイントフリーの方がプログラムの本質が一層明らかになる」とか主張するんだよね

660:デフォルトの名無しさん
08/03/25 04:21:26
彼らの変形萌えぶりをみれば、
それほど無茶を言ってないと思えるよ。
プログラム変換(人力)で成果挙げてるからね。

661:デフォルトの名無しさん
08/03/26 00:32:30
Haskell のテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
URLリンク(codepad.org)
コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。



662:デフォルトの名無しさん
08/03/26 04:41:11
なんであんたあちこちで宣伝してんの?

663:デフォルトの名無しさん
08/04/01 12:06:11
GHCのドキュメントをMakeするときに必要な
stringparamっていうプログラムって何でしょうか?これが無いせいでhtmlドキュメントが生成できません
xmlproc関係のものだと言う気はするんですが、検索しても見付かりません
入手方法など情報お願いします

664:デフォルトの名無しさん
08/04/01 12:20:15
stringparamはプログラムじゃなくてxsltprocのコマンドラインオプションじゃないか?

665:デフォルトの名無しさん
08/04/01 21:14:03
なるほど、どもです
どうやら原因はMakeの中で上手くxsltproc関連の変数が設定されてないのが原因でした

666:デフォルトの名無しさん
08/04/05 01:33:37
以下のコードでtimeout関数の動作確認をしたのですが、
うまく動作しません。何がいけないのでしょうか?

import System.Timeout

main = do a <- timeout (3*10^6) getLine
print a



667:デフォルトの名無しさん
08/04/05 02:07:19
>>666
俺の環境(Linux x86 ghc-6.8.2 base-3.0.1.0)だと動いたよ
windowsだとHandleからの入力でブロックするときにselectを使ってないから、そのせいかも

668:デフォルトの名無しさん
08/04/05 19:56:39
モナドとかって解りやすく
書いた論文とかありますか?

PARSEC使いたいのですが
どうにも曖昧で


669:デフォルトの名無しさん
08/04/05 20:15:35
>>668
I Love Ruby本

670:デフォルトの名無しさん
08/04/05 20:50:09
>>668
つ "The marriage of effects and monads"
つ "Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell"

ググればPDF手に入る

671:デフォルトの名無しさん
08/04/05 20:56:19
parsec使うのにモナドの知識は必要ないけどな

>>670
Tackling...はIOモナドについての論文じゃないか?

672:デフォルトの名無しさん
08/04/05 21:02:17
だったら何?

673:デフォルトの名無しさん
08/04/05 21:06:05
モナドについて知りたがってる奴にIOモナドの事を教えてもしょうがないだろ
群について知りたがってる奴に整数を教えるようなものだ

674:デフォルトの名無しさん
08/04/05 21:08:14
>>673
あとkindとかって数学の眠い本永遠と
読まないと理解できないかな?

圏とかまじで数学本気でやってねーから解らん

675:デフォルトの名無しさん
08/04/05 21:18:11
kindは全然難しいものじゃない
「Maybe Int」型の式は存在するけど単なる「Maybe」型の式は存在しないとか、
「Maybe Maybe」っていう型は不正だとか、そういう次元の話

676:デフォルトの名無しさん
08/04/05 21:21:18
パージングするとIOモナとの連携は付き物だから、
>>668は知りたくなるんじゃないかな?
知らなくてもPARSEC使えるけどね。

677:デフォルトの名無しさん
08/04/05 21:28:50
知らなくても使えるんだけど
背景とか基礎的な内容知りたく
ならない?

ならない、そうですかそうですか.....

678:デフォルトの名無しさん
08/04/05 21:41:01
Trends in functional
Programmingって毎年出てるの?

679:デフォルトの名無しさん
08/04/06 01:49:14
>>668
"Monadic parser combinators"ってテクニカルレポートが
仕組みやモナドの解説が分かりやすく書いてあってよかった。

680:デフォルトの名無しさん
08/04/06 09:06:14
自分は手続き型のメジャー言語を普段使っている人間ですが、最近関数型が話題になって
勉強しているところです。

この板の書き込みもそうですし、実際に出版されている本の数や内容など見ると、まだ
Haskellのような言語は研究者レベルの言語なんでしょうか。

個人的には今後アプリがマルチプロセスに対応せざるを得ないとか、複雑性が上がる
中で処理の信頼度を一層高める必要がある中で、Haskellのような言語がある時期から
一気にパラダイムシフトを引き起こすのじゃないか、とか妄想していますが、単なる
妄想ですかねw


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5324日前に更新/201 KB
担当:undef