[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 10/27 09:49 / Filesize : 201 KB / Number-of Response : 803
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:13 ]
haskell.org
www.haskell.org/

日本語サイト
www.sampou.org/cgi-bin/haskell.cgi
www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。

83 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:03:25 ]
部下がpoint-free styleで1000行くらいのバグ入りコードを提出

という悪夢を見てしまった

84 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:55:48 ]
>>83
現在適当な粒度の関数に分解する鶴を開発中です

85 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:05 ]
>>79
無責任名誉会長は俺ね。

86 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:07:03 ]
>>70
素直にλを残した方が分かりやすいわな。

main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)

87 名前:79 mailto:sage [2007/11/11(日) 19:39:30 ]
しかし、Haskellなどの関数型言語専門会社っていうのは憧れます。

自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が
広がったら素晴らしいなぁと本気で思ってますよ。

私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。

住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図

88 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:53:47 ]
バカっつーか、中学生臭い

89 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:59:51 ]
>>87
それは俗に言う「マッシュアップ」というやつではないか?
関数型言語と関係なくそこら辺の奴でも作れるぞ。

90 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:11:17 ]
そうだな
ただのマッシュアップだな
masuidriveのブログとか見るといいような気がするよ

そして
>>71-77,86の諸氏よありがとう
よく理解できないから明日色々試してみるわ…
Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…

91 名前:79 mailto:sage [2007/11/12(月) 07:08:04 ]
いや、マッシュアップを関数型でやってるのを見たいんだけど。

もうあるの?



92 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 11:01:32 ]
プロシンあたりで誰か発表してるかも〜

とか無責任に書いてみる

93 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:47:36 ]
>>86
そこまで来たらやっぱりこう書きたくなる

main = getArgs >>= mapM_ ((>>= putStr) . readFile)

94 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:56:09 ]
好みが分かれるもんだな
俺はラムダ抽象が嫌いなのでwhere節を使う

95 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:48:05 ]
>>94
お前の好みはhaskellには不向きだな。

96 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:14:14 ]
そうか?俺がHaskell好きな理由の一つがこれなんだが
where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない
それに嫌いって言っても使うことは結構ある。>>86みたいな例なら迷わずwhereを使うってだけで

97 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:58:37 ]
>>96
関数の内部で関数を定義できる言語はいくらでもある。rubyとか。

98 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:06:16 ]
それは知ってる。でも関数を「使った後に定義」はできんだろ

99 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:18:00 ]
使った後に定義ってどういう意味?

100 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:19:56 ]
>>99
ソースコード上で定義が参照よりも後に現れること

f x = g -- ここでgを使う
  where
    g = 2 -- ここでgを定義

101 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:26:38 ]
int main(char args[][]){
    owata();
}

void owata(){
    writefln("\(^o^)/");
}



102 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:27:46 ]
使った後に定義してるわけじゃないけど、遅延評価が便利って言いたいわけね。

103 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:28:18 ]
>>101
>>98はローカル関数の話な、誤解させてすまん

104 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:30:21 ]
>>102
なんというエスパー

105 名前:96 mailto:sage [2007/11/12(月) 21:32:27 ]
>>102
遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題
極端な話、正格な言語で
f x = y where y = 2

f x = let y = 2 in y -- このletは正格
の構文糖なだけでも俺には十分

106 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:26:37 ]
Lisp 系だったらその手の構文糖は作り放題だけどね。
実際、昔 ELisp でそんな感じの macro 自作して使ってたし。

107 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:36:21 ]
はいはい自慢はいいですよ

108 名前:デフォルトの名無しさん [2007/11/13(火) 00:18:43 ]
興ざめするから自慢とか言わないでくれよ…

109 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:48:47 ]
なら、自己満

110 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:37:02 ]
初心者です。

今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。

これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。
今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て
ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?

111 名前:デフォルトの名無しさん [2007/11/13(火) 19:37:31 ]
それなら良いわ



112 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:42:46 ]
>>110
>>73をモナドを使わずに書いてください

113 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:57:53 ]
>>110
歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、
道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。
モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。

114 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:22:01 ]
質問です

>>93をみてこんなの↓つくってみたんだけど、

main :: IO ()
main = getArgs >>= mapM_ ((>>= putStrLn.conv).readFile) >> getCPUTime >>= print
  where
    conv :: String -> String
    conv = unlines.(map ((map toLower).(filter (/= '\"')))).lines

最初に与えたファイルパスのぶんが読まれないっぽいんよ
c:\Users\aiueo> main < c:\a.txt c:\b.txt
と入力すると、b.txtの中身とCPUTimeだけが表示されるんだよね

エロい人なぜだか教えてください

115 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:27:40 ]
>>110
モナドを使わないと、実用的なHaskellのプログラムは書けない。
モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。

結論:
モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。
理論的なことは後から少しずつ覚えていけばよろし。

116 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:29:38 ]
>>114
「<」これはリダイレクション

117 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:30:00 ]
>>114
だってそれa.txtは標準入力に与えられてるもんよ
c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ

118 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:39:55 ]
>>116,117
ありがとう!

119 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:09:22 ]
ちょっとお前ら聞きたいんだけどさ
なんで>>86みたく書くんだ?
main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs
でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね?
なんか理由あんの?おせーておせーて

120 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:14:55 ]
俺も時々下から順に実行されるdoが欲しくなる

121 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:25:47 ]
>>113>>115
ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか
リストのモナドは仰るように積極的に使われていると自分も思いました。

ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に
透過参照性を維持するためのテクニックと見えてしまいます。



122 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:34:19 ]
>>119
だったら>>75が自然に見えてくるだろう

123 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:38:12 ]
でも、>>75はコンパイル通らんぞw

124 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:42 ]
>>123
処理系とそのバージョンは?

Control.Arrowをインポートしたかどうか。

125 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:48:31 ]
いや、明らかに型が合わんだろ…
readFile :: String -> IO String
putStr :: String -> IO String
(>>>) :: (Arrow a) => a b c -> a c d -> a b d
instance Arrow (->)

126 名前:125 mailto:sage [2007/11/13(火) 21:49:19 ]
間違えた
putStr :: String -> IO ()


127 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:52:41 ]
>>121
参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?

128 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:40:51 ]
>>124
無理やりコンパイル通せばこうなるぞ。

main = getArgs >>= mapM_ (readFile >>> (>>= putStr))

Kleisli使うのは俺はパスw

129 名前:デフォルトの名無しさん [2007/11/14(水) 01:19:08 ]
2次関数が苦手だったから関数言語なんて滅びてほしい

130 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:31:50 ]
釣られないぞ

131 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 05:55:26 ]
a -> IO b は Kleisli IO a b と同じ構造をもつんだけど、Haskell のnewtypeが違う型として扱ってしまうために、>>75 のように楽天的にはいかないんですな
だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど




132 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 14:53:09 ]
これでどうよ!

main = getArgs >>= mapM_ (readFile >=> putStr)

133 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:38:28 ]
入門HaskellのP104にあるインスタンス宣言について質問なんですが

instance (Eq a) => Eq (Maybe a) where
の(Eq a) => はどうして必要なんでしょうか?

134 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:05:38 ]
>>133
中身が比較できないとMaybeも比較できないじゃん
具体的には、

instance (Eq a) => Eq (Maybe a) where
  Nothing == Nothing = True
  Just a == Just b = a == b -- このa==bが意味を持つことを保証しないといけない
  _ == _ = False

135 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:39:52 ]
>>134
Maybe aとaを同一視してましたorz
わかりやすい説明ありがとうございました。

136 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:13:05 ]
do cs <- getContents
hoge <- getContents
putStr hoge

↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?

137 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:17:43 ]
>>136
getContents >>= \cs ->
getContents >>= putStr

138 名前:136 mailto:sage [2007/11/14(水) 20:05:49 ]
すいません
do cs <- getContents
 hoge <- getContents
 putStr hoge
じゃなくて
do hoge <- getContents
 cs <- getContents
 putStr hoge
の間違いでしたorz


139 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:17:45 ]
>>138
getContents >>= \hoge ->
getContents >>= \cs ->
putStr hoge

このケースでは(>>=)を使う旨みはないね。

140 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:11:24 ]
この場合、
A. getContentsを2回やってからputStr
B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留
のどっちの動作になるんだっけ。
遅延評価的にはBだよね?

141 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:18:38 ]
>>140
IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される
getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される
だから、順序としては、
1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン
2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生
で、putStrは実行されない



142 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:28:25 ]
そういう風な動作になるのか。ちょっと勘違いしてた。Thanks

143 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:55:19 ]
ここってクロスコンパイルネタはスレ違いですか?

144 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:11:31 ]
ここしかないだろw

145 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:31:03 ]
クロスコンパイルの場合、GHC(6.4.xや6.6.x)のMakefileって修正なしで通りますか?
依存関係を無視したり、更新情報を無視したり、
無いファイルを参照したり、必要なターゲットを生成しなかったりと
明らかに修正しなければならない部分が多々あるようですが


146 名前:143=145 mailto:sage [2007/11/15(木) 00:01:32 ]
私の環境で6.6.1をクロスコンパイルする場合、少なくとも

ホスト、ターゲットで共通
・distrib以下のファイルに実行許可がされていない
・configureでgmpのヘッダ、ライブラリ位置を指定しても途中から無視する
・makeをやり直した場合、すでに生成したファイルで且つ更新の必要がないものでも再ビルドする場合がある

ホストでは、
・libraries/Cabal/cabal-setup/CabalSetup.hcを生成してくれない
・かといってターゲットとして生成したファイルだとundefined referenceが発生するので-keep-hc-filesを指定してCabalSetup.oをリコンパイルしなければならない
・hc-file-bundleする際、libraries/haskell-src/Language/Haskell/Parser.hsという存在しないファイルをアーカイブしようとする

(現在ビルド中ですので途中までしかわかっておりませんが)ターゲットでは
・compiler/primop*.hs-inclが空ファイルで生成される
・compiler/stage1にインタフェースファイルが生成されないためpreludeのビルドに失敗する

等が確認できました

i386-unknown-openbsd → arm-unknown-openbsdという特殊な環境ということもありますが、
普通の環境ではすんなりクロスコンパイルできるのか疑問に思えました

147 名前:143 mailto:sage [2007/11/15(木) 00:07:35 ]
ちなみにOpenBSD-makeではなくGNU-makeを使用しています

148 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:19:56 ]
Ubuntu上のemacs22+ghc6-6.1でHaskellのプログラムを色々試しているんですが
C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく
なってしまいます。そのたびにkill -KILLをしているんですが
同じような症状の人はいないでしょうか?

149 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:36:11 ]
debianですが、固まりませんね。

150 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:01:07 ]
IORefについて質問です。
do ioref <- newIORef 0
 modifyIORef ioref (+1)
 readIORef ioref >>= print

という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが
どうしてもわかりません。予想としては
・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている
という事かなと思っているんですが、この考えでいいんでしょうか?

151 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 07:23:12 ]
>>150
C言語の例でよければ

*ioref=*ioref+1;

で変更されるのは*iorefであってiorefではない。
Perlなら
$$ioref=$$ioref+1;
といった具合で。
Cで詳細に書いてみる。

void modifyIORef(int * ioref,int (*fn)(int)){
  *ioref=fn(*ioref);
}
int add1(int arg){
  return arg+1;
}
int readIORef(int * ioref){
  return *ioref;
}
int main(){
  int * ioref;
  ioref=newIORef(0);
  modifyIORef(&add1);
  printf("%d\n",readIORef(ioref));
  return 0;
}

まあ(>>=)の部分(doで省略される部分とか)までより近く書くともっと長くなりますが。
それ以前にかけるかどうかちょっと自信ないけど。
*iorefは変更されてもiorefは1回の初期化時の変更のみということで。




152 名前:150 mailto:sage [2007/11/15(木) 08:04:34 ]
>>151
つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な)
場所も用意しているということなんでしょうか?

153 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:27:06 ]
>>152
実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、
多分Hugsも似たようなもの。
一方で、言語について「Haskellは〜用意している」という言い方をするのは誤解がある気がする。
実際、>>151の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、
言語の根幹に変更を迫るような拡張じゃない。
扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。

154 名前:150 mailto:sage [2007/11/15(木) 13:37:19 ]
>>153
よくわかりました。ありがとうございます。
今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが
もうちょっと詳しい説明が欲しいなと思うことがよくあります。
そこでプログラミングPerlのような
・どのようにHaskellでプログラミングするか
・Haskellはどういう理由でこういう風になっているのか
を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に
合っている本はないでしょうか?


155 名前:143 mailto:sage [2007/11/15(木) 13:54:41 ]
Makefileを読む時間的余裕が無かったのでとりあえず
find compiler/stage1 -name ¥*.o -exec rm {} ¥;して
make -C compiler boot stage=1 && make -C compiler stage=1したら
ビルド&インストールに成功したようです
後でパッケージを作って本インストールするつもりです

日本語のクロスコンパイルのドキュメントが少ないので
作業過程を簡単に書かせていただきたいと思います
(需要は無いでしょうけど)

うざったいと思われる方は「クロスコンパイル」をNGワードにしてください


156 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:56:24 ]
>>154
・どのようにHaskellでプログラミングするか
 →『Haskell: The Craft of Functional Programming』

・Haskellはどういう理由でこういう風になっているのか
 →『Introduction to Functional Programming Using Haskell』

かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。

157 名前:150 mailto:sage [2007/11/15(木) 21:41:29 ]
>>156
その二冊ですね。お金に余裕ができたら買ってみます。

話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...)
と比べて動作する機会がほとんどないと思うんですがどうでしょうか。
変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に
載せられるローカル変数でほとんど全てが賄えるなら
どこからも参照されていないデータ(ガベージコレクタの対象になるデータ)
ができるなんてことはまずないと思うんですが・・・

158 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:41:43 ]
>>157
そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、
Haskellは平均的な言語よりずっと多くゴミを出す。
GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば
GCがどれくらい動いたかが分かる。
適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、
そのうち約9割は第0世代のGCで即座に捨てられてた。

159 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:45:57 ]
具体的に数字出されるとびっくりするなw

160 名前:デフォルトの名無しさん [2007/11/15(木) 22:47:23 ]
俺もびっくりしたwww

161 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:07:27 ]
700MB?
700mBの間違いじゃないのか



162 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:15:22 ]
700*2^20 bytesね

741,834,476 bytes allocated in the heap
108,671,480 bytes copied during GC (scavenged)
2,030,404 bytes copied during GC (not scavenged)
13,955,072 bytes maximum residency (11 sample(s))

1415 collections in generation 0 ( 0.55s)
11 collections in generation 1 ( 0.43s)

32 Mb total memory in use

163 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:10:19 ]
やさしい Haskell 入門を今見ているんですが
4.4 遅延パターン
www.sampou.org/haskell/tutorial-j/patterns.html
での最初の例
reqs = client init resps
resps = server reqs

client init (resp:resps) = init : client (next resp) resps
server (req:reqs) = process req : server reqs
がどういう意味なのかさっぱりわかりませんorz
どうして↑がだめで
client init resps = init : client (next (head resps)) (tail resps)
だとOKなんでしょうか?

164 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:19:04 ]
>>162
これって瞬間最大メモリ使用量が700MBってこと?

165 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:50:58 ]
うさのパソコンはメモリ256MB!

166 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:52:24 ]
アプリ側がメモリ確保に成功しても、
OS側で本当に実メモリを消費したとは限らないから
調べないと分からないか。


167 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:27:46 ]
>>164
アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。


168 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:15:29 ]
>>164
OSから確保したのが32MB
実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes
コピーGCだからOSから確保した領域の半分以下しか貯められない

169 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:49:52 ]
StateモナドでunsafeInterleaveIO的な関数って書けますか?
do
xs <- interleaveState $ sequence $ replicate 3 get
sequence $ map set xs

で get set get set get setの順になるようなやつ

170 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:08:04 ]
unsafe禁止令

171 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:26:23 ]
xs <- sequence $ replicate 3 $ interleaveState get
の間違いか?
どっちにしても無理だろ



172 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:36:40 ]
>>171
すいません、間違いでした
無理orz

173 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:22:17 ]
モナドと代数的データ型に的を絞って詳しく扱ってるテキストはないでしょうか


174 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:16:48 ]
foo >>= bar
としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、
というのはどうやって決まるんでしょうか?

175 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:11:03 ]
>>174
型推論。fooの型とbarの型とその式の使われ方が勘案される。

176 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:11:46 ]
>>175
それはコンパイル時と実行時のどちらでされるものなんでしょうか?

177 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:43:58 ]
>>176
実行時

178 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:57:24 ]
・型推論自体はコンパイル時。
・ただし、型クラスのディスパッチは実行時まで遅延される。
・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、
最適化の一環としてディスパッチを省略する。

こんな感じか。

179 名前:174 mailto:sage [2007/11/17(土) 12:49:35 ]
>>177、178
なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。

ところで
数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語
ttp://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%82%E3%81%AE%E3%81%BE%E3%81%AD%E9%B3%A5%
E3%82%92%E3%81%BE%E3%81%AD%E3%82%8B%E2%80%95%E6%84%89%E5%BF%AB%E3%81%AA%E3%83%91%E3%82%BA%E3%83%AB%E3%81%A8%E7%B5%
90%E5%90%88%E5%AD%90%E8%AB%96%E7%90%86%E3%81%AE%E5%A4%A2%E3%81%AE%E9%B3%A5%E7%89%A9%E8%AA%9E-%E3%83%AC%E3%82%A4%E3%
83%A2%E3%83%B3%E3%83%89-%E3%82%B9%E3%83%9E%E3%83%AA%E3%83%A4%E3%83%B3/dp/4627019017/ref=sr_1_9?ie=UTF8&s=books&qid=1195271100&sr=1-9
この本を読んだことがある人いますか?関数プログラミングの土台の考え方がわかる本らしいんですが。



180 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:28:59 ]
>>179
途中まで読んだだけだけどコンビネータの話。
S,K,I とか。Yコンビネータも出てきたかは覚えてない。

181 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:07:56 ]
a 1 = "hoge"
a 2 = 2
のような引数によって異なる型の値を返すことはOKなんでしょうか?




182 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:22:37 ]
>>181
template haskell

183 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:25:26 ]
>>181
ダメ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<201KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef