関数型プログラミング言語Haskell Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/10/30(火) 20:28:13http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0446デフォルトの名無しさん
2008/01/16(水) 19:00:45なぜか$!に慣れないので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)
0447デフォルトの名無しさん
2008/01/16(水) 19:22:34そういうわけで>>444の結果は間違ってる
0448デフォルトの名無しさん
2008/01/17(木) 19:16:160449デフォルトの名無しさん
2008/01/17(木) 19:17:040450デフォルトの名無しさん
2008/01/17(木) 21:31:07人間が不快に感じるかどうかなんて些細な問題だよな
0451デフォルトの名無しさん
2008/01/17(木) 22:19:480452デフォルトの名無しさん
2008/01/18(金) 00:05:36512ビットの素因数分解だって有限時間でできますよ。
0453デフォルトの名無しさん
2008/01/19(土) 03:21:02お前の人生も有限時間で終わるぜ
0454デフォルトの名無しさん
2008/01/19(土) 10:02:310455デフォルトの名無しさん
2008/01/19(土) 18:40:07State モナドの使い方を
教えて貰えませんか?
0456デフォルトの名無しさん
2008/01/19(土) 18:58:230457デフォルトの名無しさん
2008/01/19(土) 19:20:13例が腐るほどWEB上にあるだろ
検索してみろよ
0458デフォルトの名無しさん
2008/01/19(土) 19:22:470459デフォルトの名無しさん
2008/01/19(土) 19:34:18入門書に載ってた例だけど、
・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、
0460459
2008/01/19(土) 19:40:19例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。
手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。
0461デフォルトの名無しさん
2008/01/19(土) 21:49:50普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、
そんなどこで変更されるかわからないようなアブナイことしなくても
(a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、
普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?
0462デフォルトの名無しさん
2008/01/20(日) 08:17:57「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。
0463デフォルトの名無しさん
2008/01/20(日) 19:37:59禿言うなヽ(`Д´)ノ
0464デフォルトの名無しさん
2008/01/20(日) 20:55:16hageにも人権をヽ(`Д´)ノ
0465デフォルトの名無しさん
2008/01/22(火) 10:36:580466デフォルトの名無しさん
2008/01/23(水) 15:17:31いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・
0467デフォルトの名無しさん
2008/01/23(水) 15:44:00よく使われるのは1次元配列とbit board
0468デフォルトの名無しさん
2008/01/24(木) 12:50:260469デフォルトの名無しさん
2008/01/24(木) 19:11:50ソース見てみたけど何か難しそうだ
0470デフォルトの名無しさん
2008/01/24(木) 23:03:190471デフォルトの名無しさん
2008/01/29(火) 13:51:050472デフォルトの名無しさん
2008/01/29(火) 13:58:35実際に使ったことはないけど
つttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Interfaces
0473デフォルトの名無しさん
2008/01/29(火) 14:11:30おお!ありがとうございます。
試してみます
0474デフォルトの名無しさん
2008/01/30(水) 15:37:30C言語で
int hoge(void) {
int x,i;
for(x=0, i=0; i<100000; i++) {
x=x+i;
}
return x;
}
をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。
0475デフォルトの名無しさん
2008/01/30(水) 16:03:590476デフォルトの名無しさん
2008/01/30(水) 16:09:440477デフォルトの名無しさん
2008/01/30(水) 16:16:33俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな
0478474
2008/01/30(水) 16:19:09ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?
0479デフォルトの名無しさん
2008/01/30(水) 16:29:10どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第
0480474
2008/01/30(水) 16:34:17ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?
0481デフォルトの名無しさん
2008/01/30(水) 16:50:17> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk
0482デフォルトの名無しさん
2008/01/30(水) 16:52:05処理系と最適化オプションに依る
素朴な遅延評価だと前者
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の蓄積引数が積極評価されるので後者になる
0483482
2008/01/30(水) 17:08:24どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの
0485デフォルトの名無しさん
2008/01/30(水) 17:56:59http://www.lambda-bound.com/book/lambdacalc/node21.html
0486デフォルトの名無しさん
2008/01/30(水) 18:22:54http://sourceforge.net/project/showfiles.php?group_id=168626
で6.8.1用のwxHaskellをダウンロードしてインストールし、
Windows XPでwxHaskellのサンプル(Minimal.hs)を
ghc --make Minimal.hs
としてコンパイルしてみたのですが、
出来上がったMinimal.exeをエクスプローラからダブルクリックで実行すると
目的のウインドウとコマンドプロンプトのウインドウの両方が表示されてしまいます。
コマンドプロンプトのウインドウはとても邪魔なのですが、
これが表示しないようにするにはどうすればよいのでしょうか?
さらに、実行ファイルを配布する際にDLLを付属するのは格好が悪いので、
DLLを使わないコンパイル方法はないものでしょうか?
0487486
2008/01/30(水) 18:29:59コンパイルオプションに-optl-mwindowsをつければよいのですね。
早とちりしてすみません。
後者の方はまだ解決していません。
0488486
2008/01/30(水) 19:01:48http://e.tir.jp/wiliki?hdn
> よく読んだら、「余分なデータの削除なるオプションで500KB弱になった」と書いてある。それらしいオプションは……
>
> --overlay=strip strip any extra data attached to the file [DANGEROUS]
>
> なんか、「DANGEROUS」って書いてあるんだが。
とありますが、ghc6.8.1ではそのオプションは削除されています。
http://e.tir.jp/wiliki?hdn
> stripと言えば、binutils付属のstripコマンドもあった。
> ...
> strip -s hsddd01.exe
> 2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。
この方法はマニュアルの
http://www.haskell.org/ghc/docs/latest/html/users_guide/smaller.html
に言及されていました。
-funfolding-use-threshold0
というオプションをMinimal.hsのコンパイル時につけると逆に若干ファイルサイズが増えました。
0489デフォルトの名無しさん
2008/01/31(木) 12:20:45-profフラグ付でコンパイルしようとすると
Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4?
と出て失敗してしまいます。(profフラグをつけなければ成功します)
対処方ご存知の方いらっしゃいますか?
つか、ByteStringに変更してさらに遅くなった俺涙目
0490デフォルトの名無しさん
2008/01/31(木) 17:57:26その--overlay=stripはupxのオプションだろ
>>489
そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない
0491デフォルトの名無しさん
2008/02/01(金) 02:37:31windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか?
ロックがかかったままのファイルに書き込みする必要があるのです。
0493デフォルトの名無しさん
2008/02/03(日) 17:41:55main = putStrLn "こんにちは、世界!"
% ghc hello.hs -o hello
% ./hello
...... ←[ここは文字化け]
UTF-8でソースを書いて、コンパイル&実行したのですが、
文字化けします。
ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、
UTF-8は使えないのでしょうか?
コンパイルオプションが必要ですか?
0494デフォルトの名無しさん
2008/02/03(日) 18:05:27>>5-6参照
0496デフォルトの名無しさん
2008/02/03(日) 21:46:49ふつケルの終わりのほうに超簡易Parsec実装の解説がある。
0497デフォルトの名無しさん
2008/02/05(火) 12:00:00たとえば
do { a <- return 1; Just 2 }
は
return 1 >>= (\a -> Just2)
なのはぎりぎりわかったような感じですが
3つ以上
do { a <- return 1; Just 2; return a }
だとどうなるのでしょうか?
0498デフォルトの名無しさん
2008/02/05(火) 12:13:230499デフォルトの名無しさん
2008/02/05(火) 12:29:01最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a
0501デフォルトの名無しさん
2008/02/06(水) 15:33:19do { a <- return 1
; Just 2
}
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;
0502デフォルトの名無しさん
2008/02/08(金) 00:28:19リファレンス見てたらそれっぽいのが・・・。
0503デフォルトの名無しさん
2008/02/08(金) 00:31:47(1::Int32)
0504デフォルトの名無しさん
2008/02/08(金) 11:53:24キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない
0505デフォルトの名無しさん
2008/02/08(金) 16:20:260506デフォルトの名無しさん
2008/02/08(金) 20:12:040507デフォルトの名無しさん
2008/02/08(金) 20:26:50忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの
0508デフォルトの名無しさん
2008/02/09(土) 14:13:19Haskellプログラムの実例が載ってる本というと、Craftになりますか?
ちょっと高価な本なので、買おうか迷ってます。
0509デフォルトの名無しさん
2008/02/11(月) 15:35:27http://research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm
4.4 Declaration style vs expression style
0510デフォルトの名無しさん
2008/02/15(金) 19:30:200511デフォルトの名無しさん
2008/02/15(金) 19:31:040512デフォルトの名無しさん
2008/02/15(金) 19:33:20クレイスリ
0513デフォルトの名無しさん
2008/02/15(金) 20:04:550514デフォルトの名無しさん
2008/02/15(金) 20:32:570515デフォルトの名無しさん
2008/02/15(金) 20:35:58ドイツ語の規則に従って読んでる点で
クライスリーの方が信憑性はある
0516デフォルトの名無しさん
2008/02/15(金) 20:39:36Linuxをライナックスと読むのはおかしいですか
0517デフォルトの名無しさん
2008/02/15(金) 20:43:060518デフォルトの名無しさん
2008/02/15(金) 20:44:150519デフォルトの名無しさん
2008/02/15(金) 20:45:10それはそれで正しいと申すか
0520デフォルトの名無しさん
2008/02/15(金) 20:46:270521デフォルトの名無しさん
2008/02/15(金) 20:47:54これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。
0522デフォルトの名無しさん
2008/02/15(金) 20:48:090523デフォルトの名無しさん
2008/02/15(金) 21:34:530524デフォルトの名無しさん
2008/02/15(金) 21:43:550525デフォルトの名無しさん
2008/02/15(金) 21:44:190526デフォルトの名無しさん
2008/02/15(金) 22:15:000527デフォルトの名無しさん
2008/02/15(金) 22:28:35頭の悪いHaskell厨増殖しすぎwwwwwwww
0528デフォルトの名無しさん
2008/02/16(土) 08:55:10Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw
0529デフォルトの名無しさん
2008/02/17(日) 21:01:38http://www.nicovideo.jp/watch/sm2336941
伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」
伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」
後藤「.........ウザい」
二人「キャッハハハハハwwwww」
伊藤「ちょほんとさあ、大丈夫?www」
後藤「おい天使、おいおい自称天使ww」
伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」
後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」
伊藤「それかもう日本出て行ったらいいんじゃないの?www」
後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」
伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」
後藤「コワイヨーwwwコワイヨーwwwww」
二人「クックックックwwww」
0530デフォルトの名無しさん
2008/02/18(月) 09:51:500531デフォルトの名無しさん
2008/02/18(月) 12:06:05ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。
0532デフォルトの名無しさん
2008/02/18(月) 12:16:090533デフォルトの名無しさん
2008/02/18(月) 12:28:40おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。
0534デフォルトの名無しさん
2008/02/18(月) 12:39:56でも一々「ほぼ純粋な関数型言語」とか言うのか?
0535デフォルトの名無しさん
2008/02/18(月) 12:48:31純粋なんて言葉をつけるのはおこがましい。
0536デフォルトの名無しさん
2008/02/18(月) 12:52:230537デフォルトの名無しさん
2008/02/18(月) 12:57:120538デフォルトの名無しさん
2008/02/19(火) 08:11:48ttp://builder.japan.zdnet.com/news/story/0,3800079086,20367512,00.htm
0539デフォルトの名無しさん
2008/02/19(火) 11:08:19SchemeやMLは副作用無しじゃI/Oができないし。
0540デフォルトの名無しさん
2008/02/20(水) 12:44:17よく落ちる糞公式だな
0541デフォルトの名無しさん
2008/02/21(木) 21:11:23http://pc11.2ch.net/test/read.cgi/dtm/1194648279/216
0542デフォルトの名無しさん
2008/02/21(木) 21:29:530543デフォルトの名無しさん
2008/02/21(木) 22:42:17Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?
0544543
2008/02/21(木) 22:43:03haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。
0545543
2008/02/22(金) 20:08:04■ このスレッドは過去ログ倉庫に格納されています