トップページtech
994コメント330KB

関数型プログラミング言語Haskell Part8

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/10/30(火) 20:28:13
haskell.org
http://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
>>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)
0447デフォルトの名無しさん2008/01/16(水) 19:22:34
今気付いたけど、toBaseN_loopのdivは片方modじゃないといかんな
そういうわけで>>444の結果は間違ってる
0448デフォルトの名無しさん2008/01/17(木) 19:16:16
たかだか有限時間で終わる処理について実行効率など考える必要はない
0449デフォルトの名無しさん2008/01/17(木) 19:17:04
神様キター!
0450デフォルトの名無しさん2008/01/17(木) 21:31:07
>>448
人間が不快に感じるかどうかなんて些細な問題だよな
0451デフォルトの名無しさん2008/01/17(木) 22:19:48
だったら数学やっててくれ。
0452デフォルトの名無しさん2008/01/18(金) 00:05:36
>>448
512ビットの素因数分解だって有限時間でできますよ。
0453デフォルトの名無しさん2008/01/19(土) 03:21:02
>>448
お前の人生も有限時間で終わるぜ
0454デフォルトの名無しさん2008/01/19(土) 10:02:31
この宇宙は有限時間で終わりますか?
0455デフォルトの名無しさん2008/01/19(土) 18:40:07
どなたか
State モナドの使い方を
教えて貰えませんか?
0456デフォルトの名無しさん2008/01/19(土) 18:58:23
使いどころが知りたいのか書きかたが知りたいのか
0457デフォルトの名無しさん2008/01/19(土) 19:20:13
>>455
例が腐るほどWEB上にあるだろ
検索してみろよ
0458デフォルトの名無しさん2008/01/19(土) 19:22:47
使いどころです。
0459デフォルトの名無しさん2008/01/19(土) 19:34:18
>>458
入門書に載ってた例だけど、

・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、
04604592008/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
>>461
「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。
0463デフォルトの名無しさん2008/01/20(日) 19:37:59
>>460
禿言うなヽ(`Д´)ノ
0464デフォルトの名無しさん2008/01/20(日) 20:55:16
>>460
hageにも人権をヽ(`Д´)ノ
0465デフォルトの名無しさん2008/01/22(火) 10:36:58
(("nukege") "usuge" (("fuga") "usuge" ("fuga")))
0466デフォルトの名無しさん2008/01/23(水) 15:17:31
オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、
いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・
0467デフォルトの名無しさん2008/01/23(水) 15:44:00
>>466
よく使われるのは1次元配列とbit board
0468デフォルトの名無しさん2008/01/24(木) 12:50:26
ByteStringでのParsec実装が欲しいっす。
0469デフォルトの名無しさん2008/01/24(木) 19:11:50
そういえばParsecがどうやって実装されてるか知らない
ソース見てみたけど何か難しそうだ
0470デフォルトの名無しさん2008/01/24(木) 23:03:19
普通にモナドじゃないの?
0471デフォルトの名無しさん2008/01/29(火) 13:51:05
log4*的なロガーライブラリってないでしょうか?
0472デフォルトの名無しさん2008/01/29(火) 13:58:35
>>471
実際に使ったことはないけど
つttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Interfaces
0473デフォルトの名無しさん2008/01/29(火) 14:11:30
>>472
おお!ありがとうございます。
試してみます
0474デフォルトの名無しさん2008/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で書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。
0475デフォルトの名無しさん2008/01/30(水) 16:03:59
まるで最低一種類は自力で書けるかのような言い方だな
0476デフォルトの名無しさん2008/01/30(水) 16:09:44
どんな場合にも一番いい方法が存在するかのような言い方だな
0477デフォルトの名無しさん2008/01/30(水) 16:16:33
>>474
俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな
04784742008/01/30(水) 16:19:09
>>477
ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?
0479デフォルトの名無しさん2008/01/30(水) 16:29:10
>>478
どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第
04804742008/01/30(水) 16:34:17
>>479
ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?
0481デフォルトの名無しさん2008/01/30(水) 16:50:17
>>480
> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk
0482デフォルトの名無しさん2008/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の蓄積引数が積極評価されるので後者になる
04834822008/01/30(水) 17:08:24
分りにくい気がしたので補足

どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの
04844742008/01/30(水) 17:08:53
>>482
ありがとうございます。
とても参考になりました。
0485デフォルトの名無しさん2008/01/30(水) 17:56:59
イータ簡約って奴でしょ。
http://www.lambda-bound.com/book/lambdacalc/node21.html
0486デフォルトの名無しさん2008/01/30(水) 18:22:54
質問です。

http://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を使わないコンパイル方法はないものでしょうか?
04874862008/01/30(水) 18:29:59
前者の問題は過去スレを検索して解決できました。
コンパイルオプションに-optl-mwindowsをつければよいのですね。
早とちりしてすみません。

後者の方はまだ解決していません。
04884862008/01/30(水) 19:01:48
ファイルがめちゃくちゃでかくなると思っていろいろ調べたのですが、

http://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
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に変更してさらに遅くなった俺涙目
0490デフォルトの名無しさん2008/01/31(木) 17:57:26
>>488
その--overlay=stripはupxのオプションだろ

>>489
そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない
0491デフォルトの名無しさん2008/02/01(金) 02:37:31
質問です。

windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか?
ロックがかかったままのファイルに書き込みする必要があるのです。
04924892008/02/01(金) 12:44:40
>>490
なるほど、ありがとうございます。
-p付でインストールしなおしてみます。
0493デフォルトの名無しさん2008/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は使えないのでしょうか?
コンパイルオプションが必要ですか?
0494デフォルトの名無しさん2008/02/03(日) 18:05:27
>>493
>>5-6参照
04954922008/02/03(日) 18:44:28
>>493
どうもありがとうございます。
調べてみます。
0496デフォルトの名無しさん2008/02/03(日) 21:46:49
>>469
ふつケルの終わりのほうに超簡易Parsec実装の解説がある。
0497デフォルトの名無しさん2008/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 }
だとどうなるのでしょうか?
0498デフォルトの名無しさん2008/02/05(火) 12:13:23
仕様を読めれば仕様を読むのが一番早い
0499デフォルトの名無しさん2008/02/05(火) 12:29:01
>>497
最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a
05004972008/02/05(火) 12:31:43
>>499
なるほど!ありがとうございます!
0501デフォルトの名無しさん2008/02/06(水) 15:33:19
>>500
do { a <- return 1
  ; Just 2
  }
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;
0502デフォルトの名無しさん2008/02/08(金) 00:28:19
Haskell でも型のキャスト出来るんかね
リファレンス見てたらそれっぽいのが・・・。
0503デフォルトの名無しさん2008/02/08(金) 00:31:47
>>502
(1::Int32)
0504デフォルトの名無しさん2008/02/08(金) 11:53:24
>>503
キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない
0505デフォルトの名無しさん2008/02/08(金) 16:20:26
ダウンキャストに相当するのがあるのか。
0506デフォルトの名無しさん2008/02/08(金) 20:12:04
unsafeCoerceはどうよ?
0507デフォルトの名無しさん2008/02/08(金) 20:26:50
>>506
忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの
0508デフォルトの名無しさん2008/02/09(土) 14:13:19
ふつうのHaskell読み終えて、WikiBookとか眺めてるんですけど、ある程度まとまった
Haskellプログラムの実例が載ってる本というと、Craftになりますか?

ちょっと高価な本なので、買おうか迷ってます。
0509デフォルトの名無しさん2008/02/11(月) 15:35:27
>>94-96
http://research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm
4.4 Declaration style vs expression style
0510デフォルトの名無しさん2008/02/15(金) 19:30:20
Kleisliってなんて読むの?
0511デフォルトの名無しさん2008/02/15(金) 19:31:04
クライスリーじゃないの?
0512デフォルトの名無しさん2008/02/15(金) 19:33:20
>>510
クレイスリ
0513デフォルトの名無しさん2008/02/15(金) 20:04:55
クレイスリ に一致するページは見つかりませんでした。
0514デフォルトの名無しさん2008/02/15(金) 20:32:57
クライスリーだって該当する記述が2chしかないじゃないかよ。
0515デフォルトの名無しさん2008/02/15(金) 20:35:58
とりあえずドイツ語っぽい綴りを
ドイツ語の規則に従って読んでる点で
クライスリーの方が信憑性はある
0516デフォルトの名無しさん2008/02/15(金) 20:39:36
TeXをテックと読むのはおかしいですか
Linuxをライナックスと読むのはおかしいですか
0517デフォルトの名無しさん2008/02/15(金) 20:43:06
おかしい
0518デフォルトの名無しさん2008/02/15(金) 20:44:15
↑でもそういう風に読んでる人結構いるよ
0519デフォルトの名無しさん2008/02/15(金) 20:45:10
大団円を大円団と勘違いしている人は
それはそれで正しいと申すか
0520デフォルトの名無しさん2008/02/15(金) 20:46:27
俺、小さいころミートボールとゲートボールの違いが分からなかった
0521デフォルトの名無しさん2008/02/15(金) 20:47:54
>>516
これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。
0522デフォルトの名無しさん2008/02/15(金) 20:48:09
英語っぽっくウィヌックスで
0523デフォルトの名無しさん2008/02/15(金) 21:34:53
クライスリーでおk?
0524デフォルトの名無しさん2008/02/15(金) 21:43:55
別に何でもOK
0525デフォルトの名無しさん2008/02/15(金) 21:44:19
数学板で聞いてみたら?
0526デフォルトの名無しさん2008/02/15(金) 22:15:00
エルアイエヌユーエックスって読んでた・・・
0527デフォルトの名無しさん2008/02/15(金) 22:28:35
http://dev.ariel-networks.com/Members/mizyo/haskell306e30b930ec30c330b730b930c630e03068stm306b306430443066-305d306e3

頭の悪いHaskell厨増殖しすぎwwwwwwww
0528デフォルトの名無しさん2008/02/16(土) 08:55:10
>>527
Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw
0529デフォルトの名無しさん2008/02/17(日) 21:01:38
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
http://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:50
Haskellのようなピュアな言語じゃ薄汚れた現実世界のアプリは書けないと言いたいのか?
0531デフォルトの名無しさん2008/02/18(月) 12:06:05
>>530
ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。
0532デフォルトの名無しさん2008/02/18(月) 12:16:09
別にffiも変なことしなけりゃ純粋さを壊さないだろ
0533デフォルトの名無しさん2008/02/18(月) 12:28:40
>>532
おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。
0534デフォルトの名無しさん2008/02/18(月) 12:39:56
まあそうだ
でも一々「ほぼ純粋な関数型言語」とか言うのか?
0535デフォルトの名無しさん2008/02/18(月) 12:48:31
いや、ただの関数型言語だよ。
純粋なんて言葉をつけるのはおこがましい。
0536デフォルトの名無しさん2008/02/18(月) 12:52:23
いや、でも滅多に副作用を使わないのは事実だし、重要な特徴じゃん
0537デフォルトの名無しさん2008/02/18(月) 12:57:12
「モナディックI/Oを採用した関数型言語」でいいんじゃね
0538デフォルトの名無しさん2008/02/19(火) 08:11:48
HaskellによるHaskellのための開発環境Leksah 0.1
ttp://builder.japan.zdnet.com/news/story/0,3800079086,20367512,00.htm
0539デフォルトの名無しさん2008/02/19(火) 11:08:19
副作用無しでなんでもできれば純粋ってことでいいんじゃね。
SchemeやMLは副作用無しじゃI/Oができないし。
0540デフォルトの名無しさん2008/02/20(水) 12:44:17
また公式落ちてるぞ
よく落ちる糞公式だな
0541デフォルトの名無しさん2008/02/21(木) 21:11:23
LuaってHaskell系だったのか
http://pc11.2ch.net/test/read.cgi/dtm/1194648279/216
0542デフォルトの名無しさん2008/02/21(木) 21:29:53
そのスレで既に十分突っ込まれてるじゃないか
0543デフォルトの名無しさん2008/02/21(木) 22:42:17
haskellのプログラムは巨大化する傾向があるようですが、
Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?
05445432008/02/21(木) 22:43:03
すみません、言葉足らずでした。
haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。
05455432008/02/22(金) 20:08:04
とりあえず1/10ぐらいのサイズにしたいのです。
■ このスレッドは過去ログ倉庫に格納されています