07/11/13 21:52:41
>>121
参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?
128:デフォルトの名無しさん
07/11/13 23:40:51
>>124
無理やりコンパイル通せばこうなるぞ。
main = getArgs >>= mapM_ (readFile >>> (>>= putStr))
Kleisli使うのは俺はパスw
129:デフォルトの名無しさん
07/11/14 01:19:08
2次関数が苦手だったから関数言語なんて滅びてほしい
130:デフォルトの名無しさん
07/11/14 01:31:50
釣られないぞ
131:デフォルトの名無しさん
07/11/14 05:55:26
a -> IO b は Kleisli IO a b と同じ構造をもつんだけど、Haskell のnewtypeが違う型として扱ってしまうために、>>75 のように楽天的にはいかないんですな
だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど
132:デフォルトの名無しさん
07/11/14 14:53:09
これでどうよ!
main = getArgs >>= mapM_ (readFile >=> putStr)
133:デフォルトの名無しさん
07/11/14 15:38:28
入門HaskellのP104にあるインスタンス宣言について質問なんですが
instance (Eq a) => Eq (Maybe a) where
の(Eq a) => はどうして必要なんでしょうか?
134:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/14 16:39:52
>>134
Maybe aとaを同一視してましたorz
わかりやすい説明ありがとうございました。
136:デフォルトの名無しさん
07/11/14 19:13:05
do cs <- getContents
hoge <- getContents
putStr hoge
↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?
137:デフォルトの名無しさん
07/11/14 19:17:43
>>136
getContents >>= \cs ->
getContents >>= putStr
138:136
07/11/14 20:05:49
すいません
do cs <- getContents
hoge <- getContents
putStr hoge
じゃなくて
do hoge <- getContents
cs <- getContents
putStr hoge
の間違いでしたorz
139:デフォルトの名無しさん
07/11/14 21:17:45
>>138
getContents >>= \hoge ->
getContents >>= \cs ->
putStr hoge
このケースでは(>>=)を使う旨みはないね。
140:デフォルトの名無しさん
07/11/14 22:11:24
この場合、
A. getContentsを2回やってからputStr
B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留
のどっちの動作になるんだっけ。
遅延評価的にはBだよね?
141:デフォルトの名無しさん
07/11/14 22:18:38
>>140
IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される
getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される
だから、順序としては、
1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン
2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生
で、putStrは実行されない
142:デフォルトの名無しさん
07/11/14 22:28:25
そういう風な動作になるのか。ちょっと勘違いしてた。Thanks
143:デフォルトの名無しさん
07/11/14 22:55:19
ここってクロスコンパイルネタはスレ違いですか?
144:デフォルトの名無しさん
07/11/14 23:11:31
ここしかないだろw
145:デフォルトの名無しさん
07/11/14 23:31:03
クロスコンパイルの場合、GHC(6.4.xや6.6.x)のMakefileって修正なしで通りますか?
依存関係を無視したり、更新情報を無視したり、
無いファイルを参照したり、必要なターゲットを生成しなかったりと
明らかに修正しなければならない部分が多々あるようですが
146:143=145
07/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
07/11/15 00:07:35
ちなみにOpenBSD-makeではなくGNU-makeを使用しています
148:デフォルトの名無しさん
07/11/15 01:19:56
Ubuntu上のemacs22+ghc6-6.1でHaskellのプログラムを色々試しているんですが
C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく
なってしまいます。そのたびにkill -KILLをしているんですが
同じような症状の人はいないでしょうか?
149:デフォルトの名無しさん
07/11/15 01:36:11
debianですが、固まりませんね。
150:デフォルトの名無しさん
07/11/15 03:01:07
IORefについて質問です。
do ioref <- newIORef 0
modifyIORef ioref (+1)
readIORef ioref >>= print
という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが
どうしてもわかりません。予想としては
・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている
という事かなと思っているんですが、この考えでいいんでしょうか?
151:デフォルトの名無しさん
07/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
07/11/15 08:04:34
>>151
つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な)
場所も用意しているということなんでしょうか?
153:デフォルトの名無しさん
07/11/15 10:27:06
>>152
実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、
多分Hugsも似たようなもの。
一方で、言語について「Haskellは~用意している」という言い方をするのは誤解がある気がする。
実際、>>151の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、
言語の根幹に変更を迫るような拡張じゃない。
扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。
154:150
07/11/15 13:37:19
>>153
よくわかりました。ありがとうございます。
今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが
もうちょっと詳しい説明が欲しいなと思うことがよくあります。
そこでプログラミングPerlのような
・どのようにHaskellでプログラミングするか
・Haskellはどういう理由でこういう風になっているのか
を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に
合っている本はないでしょうか?
155:143
07/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:デフォルトの名無しさん
07/11/15 13:56:24
>>154
・どのようにHaskellでプログラミングするか
→『Haskell: The Craft of Functional Programming』
・Haskellはどういう理由でこういう風になっているのか
→『Introduction to Functional Programming Using Haskell』
かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。
157:150
07/11/15 21:41:29
>>156
その二冊ですね。お金に余裕ができたら買ってみます。
話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...)
と比べて動作する機会がほとんどないと思うんですがどうでしょうか。
変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に
載せられるローカル変数でほとんど全てが賄えるなら
どこからも参照されていないデータ(ガベージコレクタの対象になるデータ)
ができるなんてことはまずないと思うんですが・・・
158:デフォルトの名無しさん
07/11/15 22:41:43
>>157
そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、
Haskellは平均的な言語よりずっと多くゴミを出す。
GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば
GCがどれくらい動いたかが分かる。
適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、
そのうち約9割は第0世代のGCで即座に捨てられてた。
159:デフォルトの名無しさん
07/11/15 22:45:57
具体的に数字出されるとびっくりするなw
160:デフォルトの名無しさん
07/11/15 22:47:23
俺もびっくりしたwww
161:デフォルトの名無しさん
07/11/15 23:07:27
700MB?
700mBの間違いじゃないのか
162:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/16 01:10:19
やさしい Haskell 入門を今見ているんですが
4.4 遅延パターン
URLリンク(www.sampou.org)
での最初の例
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:デフォルトの名無しさん
07/11/16 02:19:04
>>162
これって瞬間最大メモリ使用量が700MBってこと?
165:デフォルトの名無しさん
07/11/16 02:50:58
うさのパソコンはメモリ256MB!
166:デフォルトの名無しさん
07/11/16 02:52:24
アプリ側がメモリ確保に成功しても、
OS側で本当に実メモリを消費したとは限らないから
調べないと分からないか。
167:デフォルトの名無しさん
07/11/16 03:27:46
>>164
アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。
168:デフォルトの名無しさん
07/11/16 07:15:29
>>164
OSから確保したのが32MB
実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes
コピーGCだからOSから確保した領域の半分以下しか貯められない
169:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/16 18:08:04
unsafe禁止令
171:デフォルトの名無しさん
07/11/16 18:26:23
xs <- sequence $ replicate 3 $ interleaveState get
の間違いか?
どっちにしても無理だろ
172:デフォルトの名無しさん
07/11/16 18:36:40
>>171
すいません、間違いでした
無理orz
173:デフォルトの名無しさん
07/11/16 22:22:17
モナドと代数的データ型に的を絞って詳しく扱ってるテキストはないでしょうか
174:デフォルトの名無しさん
07/11/17 03:16:48
foo >>= bar
としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、
というのはどうやって決まるんでしょうか?
175:デフォルトの名無しさん
07/11/17 07:11:03
>>174
型推論。fooの型とbarの型とその式の使われ方が勘案される。
176:デフォルトの名無しさん
07/11/17 11:11:46
>>175
それはコンパイル時と実行時のどちらでされるものなんでしょうか?
177:デフォルトの名無しさん
07/11/17 11:43:58
>>176
実行時
178:デフォルトの名無しさん
07/11/17 11:57:24
・型推論自体はコンパイル時。
・ただし、型クラスのディスパッチは実行時まで遅延される。
・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、
最適化の一環としてディスパッチを省略する。
こんな感じか。
179:174
07/11/17 12:49:35
>>177、178
なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。
ところで
数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語
URLリンク(www.amazon.co.jp)
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:デフォルトの名無しさん
07/11/17 13:28:59
>>179
途中まで読んだだけだけどコンビネータの話。
S,K,I とか。Yコンビネータも出てきたかは覚えてない。
181:デフォルトの名無しさん
07/11/17 16:07:56
a 1 = "hoge"
a 2 = 2
のような引数によって異なる型の値を返すことはOKなんでしょうか?
182:デフォルトの名無しさん
07/11/17 16:22:37
>>181
template haskell
183:デフォルトの名無しさん
07/11/17 16:25:26
>>181
ダメ
184:デフォルトの名無しさん
07/11/17 16:30:24
2種類の型のどちらかを返したい場合はEitherを使う。
a :: Int -> Either String Int
a 1 = Left "hoge"
a 2 = Right 2
185:182
07/11/17 16:51:52
template haskellじゃなくてgeneric haskellだった・・
186:デフォルトの名無しさん
07/11/17 22:16:41
>>163
今日Haskell始めたばかりのド素人なんだけど、
ones = addlist 1 onesでも、
addlist init xs = init : head xs : tail xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init xs = init : xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init ~(x:xs) = init : x : xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init (x:xs) = init : x : xs -- C stack overflow
ってなる。要するに(x:xs)が含まれる部分が先に解釈されるとマズいってことじゃないかな。
単体でのxsはパターンはパターンでも手続き型言語での仮引数と同じ程度の意味しかもたないパターンだから暗黙的に遅延される。
head xsやtail xsも関数だからxsが未確定なら遅延される。
でも(x:xs)というパターンは未確定でも遅延しないでxとxsを照合しようとする。
結果的にinitに値がセットされる前にx:xsを延々と調べ続ける。それではマズいので、(x:xs)を遅延パターンにする、ってことじゃないかな。
187:デフォルトの名無しさん
07/11/17 23:24:01
>>163
明日からHaskell始めるつもりのド素人なんだけど、
関数の仮引数xがconstructor pattern(たとえばy:ys)の場合、
それはcase x of y:ys -> ...という形に変換される。
で、caseの条件式はWHNFまで評価されてしまうので、
遅延させたい時には使えない。
188:186
07/11/17 23:31:58
>>188
あ、なるほどそういうことなのか。
ありがとう。無理して答えた価値あったわ。
189:163
07/11/17 23:59:14
なんとなく理解できました。ありがとうございます。
Haskellの考え方に慣れるまでまだ時間がかかりそうですorz
190:デフォルトの名無しさん
07/11/18 00:28:05
sequence :: Monad m => [m a] -> m [a]
sequence = foldr mcons (return [])
where mcons p q = p >>= \x -> q >>= \y -> return (x:y)
↑のsequenceの定義を見るとfoldrが使われているんですが、それだと
sequence [putStr "foo", putStr "bar"] の場合リストの後ろの方、
つまりputStr "bar"の方が先に評価されるのに、実際には
fooの方が先に出力されてしまいます。どうして後ろからではなく、先頭から
評価されるんでしょうか?
191:デフォルトの名無しさん
07/11/18 00:55:14
式の評価順とIOモナドの実行順は別物。
192:デフォルトの名無しさん
07/11/18 01:04:47
sequence [A, B, C]
= A `mcons` (B `mcons` (C `mcons` (return [])))
= A >>= (\x -> (B `mcons` (C `mcons` (return []))) >>= \y -> return (x:y))
よってA, B, Cの順にエフェクトが出る。
193:デフォルトの名無しさん
07/11/18 01:17:35
>>178
Haskell今日始めた人なんだけど
その最適化の一環としてディスパッチが省略された場合ってのは
C++でいうとtemplateによってコード生成された状態と考えていいんですかね
194:デフォルトの名無しさん
07/11/18 02:12:23
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return x
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return y
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return "bar"
↑のように最後にreturnさえすればエラーにならずhogefooと出力されるということは、
IOモナドはMaybeモナドやListモナドと違って、最後に何を返すかではなく、
動作をどういう順に行うのかを決めるための仕組みだと考えればいいんでしょうか?
195:デフォルトの名無しさん
07/11/18 08:09:29
>>193
そんな感じ。
>>194
何を返すかによってmainの型が違う。
上の二例ではIO ()で、最後の例だとIO String。
両方コンパイルが通るのは、mainの型はIO αという形なら何でもよく、
生成されたα型の値は無視されることになってるから。
196:デフォルトの名無しさん
07/11/18 13:45:25
>>178
実行時にならないとどのインスタンスのコードが実行されるか
静的に決まらない場合ってどんな場合??
197:デフォルトの名無しさん
07/11/18 13:51:59
>>196
クラスのインスタンス一般に対して書かれた関数は全部そう。例えば、
double :: (Num a) => a -> a
double x = x + x
こんな関数を定義したら、これをコンパイルする時点ではどの(+)を使うべきか決まらない。
198:193
07/11/18 13:56:54
>>197
その関数doubleに対して具体的に値を入れたときに
コード生成される(静的に生成?)んじゃないんですかね?
頭がC++脳なのでtemplateのことばっかり頭に浮かんでしまうんですがね…
199:デフォルトの名無しさん
07/11/18 14:08:31
>>198
少なくともGHCやJHCならdoubleが定義されたモジュールをコンパイルする時点でコードを生成する。
そうじゃないと、doubleを使う度に毎回doubleをコンパイルすることになって、
分割コンパイルの恩恵が薄れる。(C++はあえてこれをやってるわけだが)
それから、Haskellの仕様上、完全に静的に済ますわけにはいけない。
newtype P a = P a deriving Show
nq :: (Show a) => Int -> a -> String
nq 0 x = show x
nq n x = nq (n-1) (P x)
こういう関数をtemplate式でコンパイルしようとしたら、無限にnqのインスタンスを生成する必要がある。
あと、実際にはdoubleのような小さい関数はインライン化されるので、ディスパッチが省略される可能性はある。
200:196
07/11/18 14:27:36
>>199
なるほど、値(この場合Int)に依存してどういうインスタンスのコードが
実行されるかが決定する場合があるってことか
201:デフォルトの名無しさん
07/11/18 14:34:20
1:2:3:[] -> [1,2,3]
↑がこうなるのはわかるんですが
1:2:3 -> ?
とやった場合はどんなデータができるんでしょうか?
202:186
07/11/18 14:42:10
3はリスト型じゃないからエラーになるんじゃないかな?
203:デフォルトの名無しさん
07/11/18 14:43:06
あ、名前欄消すの忘れてた……
204:デフォルトの名無しさん
07/11/18 14:46:12
>>201
(:) :: a -> [a] -> [a]
205:デフォルトの名無しさん
07/11/18 14:48:27
>>201
やってみりゃいいじゃん。それで挙動に疑問があったらここでもう一度聞いてみな。
206:201
07/11/18 15:25:47
やってみたんですがテキストに書いてコンパイルしようとするとエラーに
なるのにghciで:t 1:2とやると
1:2 :: (Num t, Num [t]) => [t]
というなんだかよくわからないメッセージが出ます。
:tだと型チェックしないのかなと思ったんですが
:t putStr 1
とやると今度はきちんとエラーが出ます。
・1:2 :: (Num t, Num [t]) => [t] は一体どういう意味なのか
・なんで:t 1:2はエラーにならないのに:t putStr 1はエラーになるのか
↑2つになる理由は何故なんでしょうか?
207:デフォルトの名無しさん
07/11/18 15:43:17
>>206
GHCは型クラス周辺を微妙に拡張してるからそのせいだろう。
Haskell98では(Num [t])という文脈はありえない。
Hugsで :t 1:2 と入れたらエラーが出たし。
208:デフォルトの名無しさん
07/11/18 15:44:43
ghcはIOの実装も特殊なんだよなー
209:デフォルトの名無しさん
07/11/18 15:53:43
一応解説。
Haskellでは1とか7とかの整数リテラルは(Num a) => aという型を与えられる。
つまりNumのインスタンスなら何にでもなり得る。具体的にはIntでもIntegerでもRationalでもいいし、
未知のユーザー定義型でもいい。
「1:2」という式では、とりあえず「1」の型をtと書くと、整数リテラルだから(Num t)という制約が必要。
(:)の右辺の型は左辺の型のリストだから、「2」の型は[t]。これも整数リテラルだから制約(Num [t])も要る。
式全体の型は右辺と同じで[t]だから、結果として(Num t, Num [t]) => [t]になる。
210:201
07/11/18 16:16:46
やっと理解できました。ありがとうございます。
211:デフォルトの名無しさん
07/11/18 16:19:47
なるほど、どこかで instance Num [Int] のようなことが
書かれていないとも限らない、ということですか。
212:デフォルトの名無しさん
07/11/18 16:44:20
すいません
初歩的な質問でごめんなさい。
main = do
cs <- getContents
putStr.unlines $ lines cs
これはコンパイル通るんですが
main = do
cs <- getContents
putStr.unlines.lines cs
これは通りませんでした…これって何故なんですか?
てっきりlinesとunlinesというのは対になってるもんだと思ってたんですが…
213:デフォルトの名無しさん
07/11/18 16:50:06
putStr.unlines.lines $ cs
なら通るよ。
関数適用とか演算子の優先順位の問題だね。
f $ g x == f . g $ x /= f . g x
214:デフォルトの名無しさん
07/11/18 16:55:54
うろ覚えだが関数抽象より関数適用のほうが優先されるので、
「putStr.unlines.lines cs」の部分が
putStr.unlines.(lines cs)
って解釈されるはず
main = do
cs <- getContents
(putStr.unlines.lines) cs
ならたぶん通る
215:デフォルトの名無しさん
07/11/18 16:58:16
二項演算子の周りにはスペースを入れようぜw
216:デフォルトの名無しさん
07/11/18 17:00:37
C言語で、関数と括弧の間にスペース空ける人?
217:デフォルトの名無しさん
07/11/18 17:09:39
いや、そこは詰める
まあ>>215をあまり真に受けないでくれ
218:デフォルトの名無しさん
07/11/18 17:23:42
(.) の周りにはスペースを入れない派なんだが
f.g x.h のように関数が引数を持つ場合にやるとなんか微妙
219:デフォルトの名無しさん
07/11/18 17:25:16
関数合成が関数適用より優先度低いのが許せない。
こう決めた理由はあるの?
220:デフォルトの名無しさん
07/11/18 17:25:37
Haskellの解説文を読んでいて、どっかで見たことある書き方だなぁと
思ったら、数学の教科書とソックリです。
つまり、Haskellは数学ができる人向けってことでしょうか?
221:デフォルトの名無しさん
07/11/18 17:31:13
>>213-214
うお、通りました。ありがとうございます。
関数合成と関数適用の優先順位の問題だったんですね。
222:デフォルトの名無しさん
07/11/18 18:15:00
>>219
関数適用最強の原則を守るためじゃないか?
俺は現状で満足だ。
map (fromMaybe 0 . fst) xs
とか書けるし。
223:デフォルトの名無しさん
07/11/18 18:34:32
>>219
うざい括弧をつけなくて済む
224:デフォルトの名無しさん
07/11/18 20:16:16
(f.g) x
↑↑うざい括弧
225:デフォルトの名無しさん
07/11/18 20:23:03
f.g $ xじゃね?
226:デフォルトの名無しさん
07/11/18 20:42:38
>>224
C言語風には f(g(x))
うざくない?
227:デフォルトの名無しさん
07/11/19 03:14:41
URLリンク(hpcgi2.nifty.com)
このページの2007-07-04の日記を参考にプログラムを書いているのですが
これで横型探索できる理屈がまったくわかりません
228:デフォルトの名無しさん
07/11/19 03:39:03
Stateモナドについて質問なんですが
instance Monad (State s) where
m >>= k = State $ \s -> let
(a, s') = runState m s
in runState (k a) s'
↑の式でm >>= k が m >> kなら、右辺は
State $ \s -> let
(a, s') = runState m s
in runState k s'
((k a)がkだけになる)
という風になると考えていいんでしょうか?
229:227
07/11/19 04:04:21
227ですが一応目処が立ちました。
230:デフォルトの名無しさん
07/11/19 04:24:37
>>228
それでOK。
ただm >>= kとm >> kのkはそれぞれ別の型だってことに注意。
m1 >> m2 = m1 >>= const m2 なので k=const m2 と考えると
runState (k a) s'
= runState ((const m2) a) s'
= runState m2 s'
231:228
07/11/19 10:59:03
うーん、難しい
>>=が一つだけならなんとか頭で理解できるんですが>>=が二つ以上ならんでいたり
do式で表されていたりすると脳味噌が追い付きませんorz
232:143
07/11/19 23:12:23
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分*
<ターゲット、ホストに共通>
デフォルトサーチパスにGNU MPがない場合は--with-gmp-{includes,libraries}で指定する必要があるが、
途中からこの指定(ライブラリサーチパス)を見てくれなくなる上、
できあがったGHCでも-Lオプションを指定しなければいけなくなるので
(少なくともlibgmp.so.*かlibgmp.aファイルのどちらかを)デフォルトサーチパスにシンボリックリンクしておくほうがいい。
<ホスト>
ghc-6.6.1/Makefileの
echo ghc-$(ProjectVersion)/libraries/haskell-src/Language/Haskell/Parser.hs >> hc-files-to-go
という行を削除またはコメントアウトする必要がある。
libraries/Cabal/cabal-setup/CabalSetup.hsが作られないので、
cd compiler && make boot && makeの後、
cd libraries/Cabal/cabal-setup
rm CabalSetup.{o,hi} cabalsetup
../../../compiler/ghc-inplace -H16m -O -H32m -package Cabal -c CabalSetup.hs -o CabalSetup.o -ohi CabalSetup.hi -keep-hc-files
../../../compiler/ghc-inplace -o cabal-setup -H16m -O -H32m -package Cabal CabalSetup.o
する必要がある。
make hc-file-bundle Project=Ghcの前に、
make -C rts AutoApply_thr.hc AutoApply_thr_p.hc AutoApply_debug.hc AutoApply_thr_debug.hc
する必要がある。
続く
233:143
07/11/19 23:14:33
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分* 続き
<ターゲット>
いきなり/usr/localにインストールするのではなく、stage1のためのディレクトリにインストールして、
それを利用してもう一度ghcをビルドしたほうがいいと思われる。
*-hc-tar.gzをソースツリーにコピーするのではなく、展開されるghc-6.6.1を手動でソースツリーに上書きする必要がある。
distrib以下のスクリプトに実行権限を与える必要がある。
hc-buildが完了した後、
cd compiler
rm -f *.hs-incl
make primop-can-fail.hs-incl primop-commutable.hs-incl primop-data-decl.hs-incl
primop-has-side-effects.hs-incl primop-list.hs-incl primop-needs-wrapper.hs-inc
l primop-out-of-line.hs-incl primop-primop-info.hs-incl primop-strictness.hs-inc
l primop-tag.hs-incl primop-usage.hs-incl
find . -name \*.o -exec rm {} \;
make boot stage=1 && gmake stage=1
cd ..
make install stage=1
で完了。
ちなみにザウルスのOpenBSD上では16MB以上のテキストセグメントがある実行ファイルは実行できないので
テキストセグメントを32MBに拡張したカーネルを使用しなければビルドできませんでした。
GNU makeがmakeという名前以外(gmakeなど)でインストールされている場合は、適宜読み替えてください。
かなり効率の悪い方法なので、Makefile等をちゃんと読めばもっと最適化できると思います。
古いGHCで新しいGHCをビルドするのはうまくいきますが、
新しいGHCで古いGHCをビルドするのはなかなかうまくいきませんね。
234:デフォルトの名無しさん
07/11/20 08:39:00
一度評価された式をもう一度評価しようとする場合って、再度最初から評価しなおすんですか?
例えば
add x y = x + y
という関数があって、一度
add 1 2
という式を評価した後もう一度
add 1 2
を評価しようとするとき、内部では律儀に 1 + 2 を行うんでしょうか?それとも
add 1 2 = 3
みたいな式が内部で作られてたりするんでしょうか?
235:デフォルトの名無しさん
07/11/20 09:30:04
↑の場合は俺も知りたいです
俺が知ってるのは
f x a b c = a*x*x + b*x * c
という関数に対して
f (1+2) 3 4 5
と呼び出した場合に1+2が1度しか評価されないことくらい…
236:デフォルトの名無しさん
07/11/20 10:20:01
>>234
Haskellの規格では規定されてないけど、普通は評価しなおす。
関数を全部メモ化していたら、救いようのないメモリリークが起こるはず。ただし、
map (\x -> x * add 1 2) xs
のようなコードが最適化されて
let _z = add 1 2 in map (\x -> x * _z) xs
になって、add 1 2が一回しか計算されない、という場合はある。
237:デフォルトの名無しさん
07/11/20 11:41:31
>>234-235
コンパイラのコンパイルオプションによっても動作が違うかな
import System.IO.Unsafe
f n=seq (unsafePerformIO $ putStrLn "hello") n
a=f 1+f 1
main=print a
のようなコードだとGHC6.6.1の場合で最適化なしの場合とありの場合でhelloの表示回数が違ったりする。
238:237
07/11/20 11:44:46
追記
a=f 1+f 2
でも最適化ありで1回表示、 無しで2回表示でした。
239:デフォルトの名無しさん
07/11/20 18:31:21
質問なのですが、
ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか?
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、棺おけの中だけ温度調節できれば
コスト安になると思ったのです。
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
240:デフォルトの名無しさん
07/11/20 19:04:23
ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか?
(計算をデフォルトで遅延させる機能のある、関数型のプログラム言語は市販されているのでしょうか?)
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、
(評価されない可能性のある式を正格に評価するのは効率が悪いので)
棺おけの中だけ温度調節できればコスト安になると思ったのです。
(必要になってから評価できれば計算コストを削減できると思ったのです。)
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
(一度評価されればメモ化されるので計算量が少なくなりますし、バグの混入もシャットアウトできてよいと思うのです。)
答え:Haskellは無料で公開されています
こうですか!? わかりません!
241:デフォルトの名無しさん
07/11/20 19:27:37
感動した
242:デフォルトの名無しさん
07/11/21 04:31:54
質問です
GHC6.8.1にはHGL入ってないんですか?
243:デフォルトの名無しさん
07/11/22 01:59:38
Windowsアプリ作っていて気づいたんだが、
Win32モジュールにはSetLayeredWindowAttributesのラッパは入ってないんだな・・
自作するしかないんだろうか。
244:デフォルトの名無しさん
07/11/22 07:26:41
書いてパッチを送るんだ!
245:デフォルトの名無しさん
07/11/22 12:20:00
>>244
>書いてパッチを送るんだ!
いや、これってwindows2000以降の機能で、Win32モジュールに入れるべきかどうか正直迷うんだよね。
246:デフォルトの名無しさん
07/11/22 23:16:48
Windows2000以降のラッパをまとめたWin32exモジュールを作ったので公開しました。
ツッコミなどよろしく。
247:デフォルトの名無しさん
07/11/23 09:58:22
>>245
Windowsに詳しくないので間違ってたら済まんが、2000以降のみの関数も
普通にwin32パッケージに入ってないか?setConsoleCPとかfindFirstChangeNotificationとか。
>>246
どこに置いたかも書けよw
248:デフォルトの名無しさん
07/11/23 10:06:51
246はPeyton Jonesだ。
場所は、わかるだろ。
249:デフォルトの名無しさん
07/11/26 23:05:20
関数型言語はマルチコア時代にフィットしているという話を聞いたことがあります。
既存の流行している言語は対応できてないと。
これはどういう理由でしょうか?遅延評価とか、その辺のことを指しているんでしょうか。
250:デフォルトの名無しさん
07/11/26 23:13:40
知らんけどミュータブルな値があるとスレッドセーフにならないとかそういうへんの話じゃね?
251:デフォルトの名無しさん
07/11/26 23:23:18
MapReduce の「副作用が無ければ無限にスケールする」というのが
一人歩きしてるだけじゃないかな。実際には何をするにも副作用は
あるし、MapReduce だって Reduce の作業はスケーラビリティが
殆ど無いか少ない。関数型言語には副作用が無いというのと同じ様な
勘違い。ただ副作用が無い=スケールする部分を奇麗に切り出せる
のであれば有用ではある。
252:デフォルトの名無しさん
07/11/27 11:43:41
ああいう大規模データパラレルとマルチコアはあんまり関係ないじゃん。
>>249の話は伝聞なんで雲を掴むような話だけど。
253:249
07/11/27 11:48:13
ありがとうございます。透過参照性がスレッドセーフというのはよく分かります。
遅延評価っていうのは、別に関係ないんでしょうか。何かそっちの話を聞いた
ことがあるんです。自分の初心者脳では、正格では無限のリソースを前提に
した関数を書けないが、Haskellのような言語だと記述可能、とか思ったのですが、
ちょっと頭悪いですか?w
254:デフォルトの名無しさん
07/11/27 12:16:38
遅延評価や投機実行をうまく使えば、
CPUコアの利用効率を上げられますが、
それには頭のいいスケジューラが必要なわけで。
例えば、
URLリンク(www.fixstars.com)
にプチ解説があるようなstragglersの問題。
ただ実行順序が規定されてないので、
工夫する余地がまだまだ残されているとは言えると思う。
Erlangのような言語が、あまりpure functionalじゃないとはいえ、
一通りの実績を上げていますし。
また、プログラマがスケジューラに自由を与えるような
プログラミングスタイルを強制されているという見方もあると思う。
255:デフォルトの名無しさん
07/12/06 10:41:19
F#のスレは毎日更新されてますが、こちらは静かですね・・・
関数型で今イチバン売れ筋なのはF#なんですかね。
256:デフォルトの名無しさん
07/12/06 17:36:48
Haskell始めてから3週間目の今の感想。
・概念的にはMonadよりArrowのほうが分かりやすいんじゃないか?とか。
・Monadって何?って聞かれるとなんと答えていいかわからないが、
Arrowなら『矢印をカプセル化したようなもの』と言える。
あとは適当に結合演算とか普通の関数をアロー化する演算とか実装していけばおk。
脳内のイメージも矢印をつないでいくだけだし。
Monadをイメージしようとしてもなんかいまいちピンとこない……。
bindにやる夫関数とか適当に名前を付けて無理矢理イメージしたけど。
・Monadのbind演算子(>>=)はm a -> (a -> m b) -> m bで非対称的。
Arrowの(>>>)はa b c -> a c d -> a b dで比較的対称性があって気持ちよい。
・Arrowは『計算を結合』しているのが自明的に表現されてる。
Monadは別にそうは見えない。……値と計算を結合なのか?意味わかんね。
・そもそも非対称な二項中置演算子はイマイチ気に入らない。
リスト結合演算子とか`elem`とかは仕方ないけど、せめてあまり高階にしてほしくない
・Monadの計算部(a -> m b)は結構重要なパーツの一つなのに、名前が付いてない。
だから『モナドを返す関数』としかいえねえ。
しかもbindした後にはその返り値とは(型は同じだけど)別の奴が帰ってくる。無駄に混乱。
その点Arrowは計算部がずばり『Arrow』。カプセル化されていて美しい。
・Monadは(>>=)は左から右へ流すように使えるが
普通の関数は右から左。もちろんliftMとかも右から左。
(=<<)も右から左。しかし関数を拡張して適用するという見方で見るとこっちが自然という謎さ。
結局どっちからどっちへ読むべきか迷う場所が多く、思考停止してしまう。
ArrowだったらArrowとして結合されている部分は左から右。
普通の関数は右から左で思考が自然に切り分けられる。
257:デフォルトの名無しさん
07/12/06 17:37:32
・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
Arrowはまあ基本的にポイントフリーな感じがするし、普通の関数と分けられていいんじゃない?
・Arrowの構造を作ったりする関数は基本的にArrowだけを返す。
Monadの関数はなんかリストとかに入ってたりして気味が悪い。モナドのリストって、最中十個入りじゃないんだから。
・Arrowの構造を作る関数はキチンと構造を作ってるように見える。
Monadの場合は解読に時間がかかる。なんのためにこんな書き方をしてるんだろうとか……。
・ArrowでStateを自作してみたら比較的分かりやすかった。
Monadのは今見ても訳が分からん。というかMonadの対象が関数って何だよ。
・Monadに慣れ親しんでる人はMonadを扱うのに苦労しないだろうから、
簡単なものなら短い表記が出来るMonadのほうがいいんだろう。
しかし、初心者にいきなり教えるのならArrowのほうが直感的。
ポイントフリースタイルを使いまくってムツカシイことさえしなければ。
・Arrow講座みたいな入門編とかでArrowを書くとき、
関数がそのままアローになるからってやたら省略しないでいただきたい。
アローな部分と普通の関数の部分が綺麗に分かれてるのがいいんだから……
それにarrってやっておけばその部分は一般のArrowでも使えるし。
SF f >>> SF g = SF (f >>> g)とか出来るからそういう書き方が出来ること自体はありがたいが。
・arr.uncurryとかarr.constってよく出てくるけどそういう関数はないのか……
・Arrow関係ないけどデータ構築子と型構築子が同じ名前って混乱するな。時々イラっとくる。
・aとかbとか何を表してんのか直感的じゃねえよ。型変数だったり、引数だったり……
fって名前だから関数かと思いきやArrowだったり。
ネーミング規約みたいなものはないのか……
Arrowが引数で来たときの名前の付け方とかおもいつかねえけど。
・そろそろふつける買おうかな……。
・初心者のくせに身の程をわきまえない長文失礼しました……
258:デフォルトの名無しさん
07/12/06 17:42:34
>>257
> ・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
もう少し他人のコードを読んでいくと感覚がつかめてくると思いますよ
259:デフォルトの名無しさん
07/12/06 18:11:18
モナドのリストを返す関数なんてそんなに使うか?
しかし「モナドのリスト」って言い方は何か違和感あるな。
[IO]みたいなのを想像してしまう。
260:デフォルトの名無しさん
07/12/06 18:16:50
俺のポリシーではIOはmain内でしか使わない
261:デフォルトの名無しさん
07/12/06 18:25:06
>>258
把握。
>>259
ライブラリを見返してるけどそこまではなかったかも……。
初めて見たときに比べればそこまで疲れないし。
やっぱり慣れの問題なんだろうか。『モナドを返す関数』が普通の関数と同じ地位にいるのがイマイチだけど。
引数の数でバージョンがいくつもあったりするのもなんかいただけない。
でもやっぱり慣れれば気にならなくなるんだろうな……。
なんかJavaやったらCのポインタが理解できた時の気持ちを思い出した。(違うか)
262:デフォルトの名無しさん
07/12/06 18:30:02
モナドなんてステートとIOとリストとMaybe以外はほとんどつかわねーぜ
263:デフォルトの名無しさん
07/12/06 18:30:44
IORefもつかうか。
264:デフォルトの名無しさん
07/12/06 18:38:36
a0 -> a1 -> ... -> m bの形の関数を呼ぶのにはmonadic functionという名前が使えるはず。
日本語だと「モナドな関数」か。
俺のコードの大部分はモナドな関数になってるな。
普通の関数より書きにくいから嫌なんだが、変更に強いコードにするために仕方なく。
265:デフォルトの名無しさん
07/12/08 12:05:09
やさしいHaskell入門での質問です。
URLリンク(www.sampou.org)
> (ここで、同値性といっているのは、「値同値性」のことです。
> 対照的な概念としては、「ポインタ同値性」というのがあります。
> たとえば、Java 言語の == です。
> ポインタ同値性は参照透明性を持ちません。
> それゆえに純粋な関数型言語とは相性がよくありません。)
なぜポインタ同値性は参照透明性を持たないのですか?
266:デフォルトの名無しさん
07/12/08 12:26:42
>>265
ポインタ同値をテストする関数eqがあったとすると、
let v = [1,2] in eq v v
はTrue。一方、vを展開して
eq [1,2] [1,2]
とするとFalseになるかもしれない。
参照透過って言うのはそもそも、こういう展開をしても
プログラムの意味が変わらないってことだから、
eqによって参照透過性が破られたと言える。
267:265
07/12/08 12:37:55
>>266
おー!なるほど。わかりやすい説明ありがとう。
[1,2] が複数箇所に出現する場合、メモリ上に別々に配置されるかもしれないわけですね。
勉強になりました。
268:デフォルトの名無しさん
07/12/09 15:29:39
『A a』っていう表記が使われる場所によって
Aは型構築子、全体は多相型、aはパラメータ
Aはデータ構築子、全体はデータ構造、aはその中身
aは型クラスAのインスタンス、何かの型の一部
って変わるのがちょっとわかりにくいね。もうちっとなんとかならんか。
269:デフォルトの名無しさん
07/12/09 21:35:19
Haskell勉強してなくてよくわからないんですが、
乱数生成器をsplitしていくつかにしてseed固定で乱数を作れといわれました。
どう作ればいいんでしょうか?
初歩的な質問だったらすみません。
270:デフォルトの名無しさん
07/12/10 00:51:19
日本語でおk
271:デフォルトの名無しさん
07/12/10 15:07:15
無限リストって便利だけど、末尾を正格に要求する関数について型安全じゃないよね。
でも無限リスト型を再定義するとリストに関して作ったすべての関数について委譲関数を作んなきゃいけなくて現実的じゃない。
結局これは妥協するしかないのか?それともなんらかのテクニックで回避できる?
272:デフォルトの名無しさん
07/12/11 10:46:48
>>271
日本語でおk
273:デフォルトの名無しさん
07/12/11 10:52:25
>>271
俺の知る限り、妥協するしかない
274:デフォルトの名無しさん
07/12/11 12:46:45
>>271
評価がとまらないだけで型安全だよ。
275:デフォルトの名無しさん
07/12/11 13:17:06
そう言えば、厳密に言うと無限ループでも型安全なんだな
でも全域関数でない関数が厄介なことは事実だから、何か呼び名が欲しい
276:デフォルトの名無しさん
07/12/11 17:14:07
>>275
よくわかんないけど、チューリングの停止問題のこと言ってるの?
277:デフォルトの名無しさん
07/12/11 17:30:25
>>276
いや、Haskellには失敗し得る関数があるじゃん
例えば、headはリストが空の時例外を飛ばすし、
lengthは無限リストに適用されたら終わらない
一方で、例えばdropみたいに、引数に未定義値が含まれない限り、
あらゆる引数に対してちゃんと値をもどす関数もある
だからこの二つを区別できるように、短い呼び名があれば便利だな、ということ
「型安全」という言葉を使いたくなるけど、これは>>274の言う通り誤用だし
278:デフォルトの名無しさん
07/12/11 17:40:12
>>277
そういう一般的な関数のことを部分関数というんじゃないかね
279:デフォルトの名無しさん
07/12/11 18:03:01
>>278
全域関数も部分関数の一種だから、とか考えてたけどカジュアルに使う分には問題ないか
グダグダですまん
280:271
07/12/11 19:46:50
いや、同じ構造のデータ型でも、
型システムで『無限リストかそうでないか』をカッキリ分けられたら、
そっちのほうが型安全にならないかな?と思って271を書いたんだけど。
たとえば幽霊型とか使ってそういうのが解決できないかとか思ったんだけど、
それじゃ現行の関数を活かせないし、あんまり意味ないなあ、と。
281:デフォルトの名無しさん
07/12/12 01:00:18
>>280
言いたいのは、型システムを使って、
無限リストのフロー解析をして、
プログラムの停止性、正当性などを知ることができないかってこと?
それならリストの有限性の抽象解釈をやるってことになると思うけれど。
282:271
07/12/12 01:16:01
>>281
違う。返り値が無限リストの関数で、その関数の型を明示しておけば、
無限リストに対して使ってはいけない関数の引数にした時に型エラーになるようにしたい。
まあ無理っぽいのでもう諦めてるけどな。
283:デフォルトの名無しさん
07/12/12 02:43:32
※起こりえる全てのリストのうちどれが有限リストかを確かめることは
無限に長いリストに対して演算を行うことと同じ
ってだれかが言ってた
284:デフォルトの名無しさん
07/12/12 07:57:59
だから誰も自動チェックしてくれって言ってるわけじゃないじゃない……
静的に型推論してくれるんだから、
enumFromにInt a => a -> [a] Inf
って書けるとして
lengthに[a] Ltd -> Int
みたいに指定したらコンパイルエラーになって欲しいとかそういう問題だって。無理だけど。
285:デフォルトの名無しさん
07/12/12 08:17:31
enumFromよりrepeatのほうが良かったな(repeat :: a -> [a] Inf)
あとコンパイルエラーになって欲しいのは『length.repeat x』みたいな文脈な。
286:デフォルトの名無しさん
07/12/12 09:39:03
strictな言語なら、force/delayみたいに陽に指定するんだろうから、
>>281の言うような方法も効果を挙げるだろうが、
lazyな言語だと、リストを生成する全ての関数が、
無限リストを返す可能性があるので>>276でFAだが。
[1..]が無限リストであることも、解析が必要になるし。
うまくできるケースもあるが、希少すぎる。
287:デフォルトの名無しさん
07/12/12 11:18:26
>>271が見事に無視されててワラタ
288:デフォルトの名無しさん
07/12/12 11:39:59
言葉の使い方間違ってるよな。
289:デフォルトの名無しさん
07/12/12 17:16:57
なんというか残念賞な言語だな。
関数言語としてのおいしいところは全てC#3.0に持っていかれてしまった。
290:デフォルトの名無しさん
07/12/12 17:26:09
それはギャグのつもりでいっているのか
291:デフォルトの名無しさん
07/12/12 17:27:04
>>289
関数言語?w
C#3.0?w
292:デフォルトの名無しさん
07/12/12 18:12:14
>>289
F#じゃなくて、C#かよ・・・
293:Wadler
07/12/12 22:26:38
Haskell初心者です。
a->[a]という(型の)monad(仮にDとしましょう)をつりたくて困っています。
どなたか教えてください。
とくにDのmapFにあたる関数も教えていただけれありがたいです。
294:デフォルトの名無しさん
07/12/12 23:11:10
>>293
はい?
295:デフォルトの名無しさん
07/12/12 23:12:01
とりあえず、日本語でおkと言ってほしいのですか?
296:デフォルトの名無しさん
07/12/12 23:13:50
>>295
日本語でおk
297:デフォルトの名無しさん
07/12/13 00:02:02
よくわからんが
data D a = mkD (a -> [a])
instance Monad D where ...
ってことか?
あとmapFってなんだ?fmap?
298:デフォルトの名無しさん
07/12/13 01:20:15
>>293
よくわからんが、釣りってことか?
299:デフォルトの名無しさん
07/12/13 01:23:14
>>297
mkDはなぜ先頭が大文字になってないんだ?
受理されないだろ。
300:デフォルトの名無しさん
07/12/13 01:25:29
なんなんだ?
近頃Haskellerの質の低下が激しすぎるぞ
301:デフォルトの名無しさん
07/12/13 02:15:06
昔からです
302:デフォルトの名無しさん
07/12/13 02:20:10
割と玉石混淆なイメージだね
303:デフォルトの名無しさん
07/12/13 02:23:35
暇つぶしで弄ってる学生がここで暇を潰しているイメージ
304:デフォルトの名無しさん
07/12/13 08:17:19
>>299
>>303
そのとうりですすいません……
305:デフォルトの名無しさん
07/12/13 11:07:28
>>268-304
この辺からおかしくなってきてる
306:デフォルトの名無しさん
07/12/13 11:49:46
なんにしてもHaskellerが増えるのは喜ばしいことだ
307:デフォルトの名無しさん
07/12/13 11:51:12
rubyみたいになるぐらいなら少なくてもいい
308:デフォルトの名無しさん
07/12/13 16:58:02
少数精鋭投入ならこれでいいだろうけど
大人数投入用にコードもデータもブラックボックスにできる仕組み(命令型のオブジェクト指向同等?)誰か作らないのかな
309:デフォルトの名無しさん
07/12/13 17:07:09
大人数投入っていまどき流行らないよ
人海戦術でプログラミングする時代は終わった
310:デフォルトの名無しさん
07/12/13 17:23:49
>>308
ブラックボックス化ってどんなの?
カプセル化なら標準のモジュールシステムがあるけど
311:デフォルトの名無しさん
07/12/13 17:28:42
>>308
そんなにオブジェクト指向がやりたいなら
つ O'Haskell
312:デフォルトの名無しさん
07/12/13 17:30:17
でも、そもそもオブジェクト指向は型理論に包含されるものだから・・・
313:デフォルトの名無しさん
07/12/13 17:31:50
デバドラ屋と少数のhaskellerがいればたいていのプロジェクトは成功する
・・・夢を見た
314:デフォルトの名無しさん
07/12/13 18:14:01
>>308
そもそもhaskellにはオブジェクト指向は不要なんですよ。
というのも、関数の再利用できる範囲がCやらjavaやらとは桁違いに大きいのが特徴だからです。
315:デフォルトの名無しさん
07/12/13 21:20:25
Haskellでモジュールつかってカプセル化してコード書いている人あまりいないような気がするんだけど気のせいかな。
316:デフォルトの名無しさん
07/12/13 21:22:03
なにを根拠に?
317:デフォルトの名無しさん
07/12/13 21:35:09
>>315
そもそもhaskellを使って実用アプリを公開してる人があんまりいないんだから
仕方ないだろ。
318:デフォルトの名無しさん
07/12/13 22:49:47
Haskellって関数型言語の勉強用じゃないの?
319:デフォルトの名無しさん
07/12/13 23:10:30
それだけのための言語だとどうして思うのですか?
320:デフォルトの名無しさん
07/12/14 00:39:15
GHC 6.8.2が出てるね。
GHCiの機能追加がメインっぽい。
321:デフォルトの名無しさん
07/12/14 00:53:25
HaskellはOOじゃなくて、
generic programing指向だからなあ。
Genericsの世界では最強認定を受けてる。
322:デフォルトの名無しさん
07/12/14 01:21:07
OfficeがHaskellで書きなおされるまで俺はその有用性を認めない。
323:デフォルトの名無しさん
07/12/14 02:29:17
スケーリングのための言語じゃないんだよな
工場制手工業ならOOであることやポピュラリティ(みんなが使ってること)は必須だ。
324:デフォルトの名無しさん
07/12/14 13:26:48
別に必須じゃないし。
今流行ってること取り入れたってどうせちぐはぐになるだけ。
325:デフォルトの名無しさん
07/12/14 13:28:05
っていうかさ、人海戦術の奴隷商売に慣れすぎていて、理性的な考え方を失ったお猿さんですか?
326:デフォルトの名無しさん
07/12/14 14:15:06
ポピュラリティが必須というのは分かるけど、OOが必須というのはおかしくね?
OOは一手法に過ぎないんだから、もっと良いものが知られればそっちが使われるようになるだろ
327:デフォルトの名無しさん
07/12/14 14:21:57
OOは現時点でのポピュラリティの1つって事ならわからなくもないけど、
わざわざ分けて必須って言うほどのものではないな。
328:デフォルトの名無しさん
07/12/14 14:54:59
つーか、OOはstableなlibrary構築にはいいんだけど、
意外とreusabilityが悪いから、
generic programmingが注目されているのが現状です。
Haskellのtype classとかC++のconceptみたいなやつ。
C++はtemplate/traitsでやってましたが、ちょっと非力なので、
Haskellのtype classそっくりの"concept"が入る事になりました。
329:デフォルトの名無しさん
07/12/14 14:59:18
実際これはOOと比べてどうなんだとか思ってたんだけど
実際使ってみたら意外とオブジェクト指向のメリット包含しててSUGEEとか思った
330:デフォルトの名無しさん
07/12/14 14:59:57
>>328
日本語でおk
331:328
07/12/14 15:35:51
日本語ですよ?
332:デフォルトの名無しさん
07/12/14 15:45:42
決して英語が読めないわけではないが、
不自然だ
読みにくい
目が痛い
333:デフォルトの名無しさん
07/12/14 16:23:51
理論はそのとおりなんだが、残念だがそんな理論を理解出来る人間は少数派なんだよ。
共産主義みたいなもん。高尚な理屈よりも明日パンが、今日のバグを潰せるかが問題なわけだ。
いいじゃない。Haskellは芸術的な小物を個人で作るのに向いてるってことで。
334:デフォルトの名無しさん
07/12/14 17:07:50
>>333
多数のバカよりも少数の優秀な人間でプログラミングしたほうが安く早くできます。
335:328
07/12/14 17:08:28
>>332
そういう意味か。すまん
>>328については、
URLリンク(journals.cambridge.org)
で。探せばピィーディーエフも見つかるようです。
336:デフォルトの名無しさん
07/12/14 17:09:42
>>333
どの辺の理論のことを言ってるの?
337:デフォルトの名無しさん
07/12/14 17:10:46
>>335
不自然だ
読みにくい
目が痛い
お前は日本語文書の常識を勉強したほうがよさそうだな
338:デフォルトの名無しさん
07/12/14 17:16:49
どっちにしろ、今みたいに人気がなくて、そのせいでライブラリも
周辺環境も整っていない状況だと、小物を個人で作るのすら満足にできん。
339:デフォルトの名無しさん
07/12/14 17:43:43
wxhaskellが使いやすい
が、6.8系用が出てない・・6.6系は非公式
340:デフォルトの名無しさん
07/12/14 17:52:21
いまだと.NETやJavaVMに乗せちゃえばライブラリ不足は一挙に解決だな。
341:デフォルトの名無しさん
07/12/14 17:56:18
>>339
普通にdarcs版をビルドできないか?
342:デフォルトの名無しさん
07/12/14 17:56:46
>>340
なんで?
343:デフォルトの名無しさん
07/12/14 19:53:13
conceptの導入をもってHaskellはC++のサブセットになります
つまりこれで全ての言語がC++のサブセットになるというわけです
344:デフォルトの名無しさん
07/12/14 20:54:45
本日をもってHaskellはウジ虫を卒業する
本日からHaskellはC++のサブセットである
兄弟の絆に結ばれる
Haskellのくたばるその日まで
どこにいようとC++は貴様らの兄弟だ
多くはベトナムへ向かう
ある者は二度と戻らない
だが肝に銘じておけ
C++は死ぬ
死ぬために我々は存在する
だがC++は永遠である
つまり――Haskellも永遠である!
345:デフォルトの名無しさん
07/12/15 07:46:00
初心者質問です。
test = flip fun1 . fun2
の場合、
1. test = flip (fun1 . fun2)
2. test = flip (fun1) . fun2
どっちの意味なんでしょうか。(.)が使用されている場合、flipが対象とする
関数がどこまでかかるか分かんなくなってしまいました。
346:デフォルトの名無しさん
07/12/15 08:05:18
(.)よりも関数適用のほうが優先度が高いから答えは一応 2.なんだけど、
括弧の付け方としては (flip fun1) . fun2 のほうが正しい。
347:345
07/12/15 14:13:25
>>346
ありがとうございます。合成関数全体にかかるのかと思ってました。
もう少しいいでしょうか。
URLリンク(ja.doukaku.org)
にある、
attachIndex = map (uncurry (flip zipWith [0..] . ((,) .) . flip (,))) . zip [0..]
がよく理解できないのですが、
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の部分は
zipWith (((,) .) $ flip (,) 0) [0..] "abc"
と考えられると思うのですが、何ででしょうか。(flip zipWith [0..] . ((,) .) . flip (,)) の
第一引数"0"がまず部分適応されてflipされるところが理解できません。
348:デフォルトの名無しさん
07/12/15 14:41:26
(flip zipWith [0..] . ((,) .) . flip (,)) 0
から始める。まずこの式は(A . B . C) 0という形だからA (B $ C 0)に直せて、
flip zipWith [0..] ( ((,) .) $ flip (,) 0 )
これはflip A B Cという形だからA C Bと書き換えられて、
zipWith ( ((,) .) $ flip (,) 0) [0..]
349:345
07/12/15 15:29:30
>>348
ありがとうございます。しかし、まだちょっと理解できませんw
1.第一引数"0"の部分適応を行う
2.flip する
の順番の根拠がよく分かりません。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の第二引数が最後に適応されるのは何故でしょうか。
あと、これは変な質問なんですけど、
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の形を慣れた方は直接記述できちゃうんでしょうか。それとも、
zipWith ( ((,) .) $ flip (,) 0) [0..] "abc"
の形から変形させていく形でプログラム書いていくんでしょうか。
350:デフォルトの名無しさん
07/12/15 15:37:45
>>349
Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
もっと実装に即した順序でやることもできるけど、面倒なだけな気がする。
>の形を慣れた方は直接記述できちゃうんでしょうか。
俺はできない。読むのも二分くらい掛かった。
351:デフォルトの名無しさん
07/12/15 15:42:07
あ、でもそのnobsunという人は日常的にそういうコードを書いてるみたいだから、
たぶんすらすら書けるんだろう。
352:デフォルトの名無しさん
07/12/15 15:46:11
俺思うんだけどさ、デザインパターン中毒みたいにポイントフリー中毒ってあるんじゃないかなあ。
そーいうのって可読性犠牲にしてまでやるものなのか?
353:デフォルトの名無しさん
07/12/15 15:47:28
>>350
> Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
自分がどうも腑に落ちないのは、どうして
zipWith ( ((,) .) $ flip (,) 0 "abc") [0..]
こうじゃないんだろう?ってとこなんですね。もちろん、こういう解釈だとダメなんですけど、
引数一つだけ取って、ある関数を返してから、次に行くってのがルールだったりするのかな、
と思ったのですが。
> 俺はできない。読むのも二分くらい掛かった。
そうですかw。いや、直感的に書ける人って凄いなぁって思ったんですが、なかなか
そういう人はいないんでしょうかね。
354:デフォルトの名無しさん
07/12/15 16:02:39
>>352
デザインパターン中毒はどうか知らんが、この書きかたには
記述が簡潔になるという利点があるんだから、別にいいんじゃないかと思う。
>>353
Haskellの関数は常に一引数関数で、多引数関数は
カリー化でエミュレートされているだけだということを思い出すべし。
(.)も両辺を一引数関数として合成するから、
(f . g) a b
と
f (g a b)
は等しくない。
355:デフォルトの名無しさん
07/12/15 16:05:04
些細なことだけど
> (f . g) a b
この括弧なんとかならないかな
356:デフォルトの名無しさん
07/12/15 16:13:51
>>354
> Haskellの関数は常に一引数関数で、多引数関数は
> カリー化でエミュレートされているだけだということを思い出すべし。
そうでしたw。
いやぁ、ありがとうございます。スッキリしました。
357:デフォルトの名無しさん
07/12/15 16:36:06
>>355
>219に戻れ
358:デフォルトの名無しさん
07/12/15 16:43:36
>>357
>>219とは趣旨が違う
> (f . g) a b
この括弧はうっとうしいなぁと言ってるだけなんだよ。
$みたいに括弧省略したい
359:デフォルトの名無しさん
07/12/15 17:10:55
俺はその格好が好きだ
360:デフォルトの名無しさん
07/12/15 17:31:40
ML でも (foo o bar o baz o foobar) quux みたいに書くね
361:デフォルトの名無しさん
07/12/15 20:25:33
>>358
お前は何を言っているんだ
362:デフォルトの名無しさん
07/12/15 21:14:46
>>361
心で感じろ
363:デフォルトの名無しさん
07/12/16 01:37:28
>>361
風を感じろ
364:デフォルトの名無しさん
07/12/16 01:45:32
GHC 6.8.2 Windows版で、コンソールのコードページが英語のになるバグがようやく直ったな。
365:デフォルトの名無しさん
07/12/16 20:36:29
Parallel Haskellの拡張されてる点ってどんなとこ?
366:デフォルトの名無しさん
07/12/17 08:39:00
>>364
太字になるのは?
367:デフォルトの名無しさん
07/12/17 09:27:14
WindowsでGHCなんか使うやつはバカです
368:デフォルトの名無しさん
07/12/17 11:39:39
同感
369:デフォルトの名無しさん
07/12/17 11:47:31
windowsではGHC以外に何が一番いいの?
370:デフォルトの名無しさん
07/12/17 16:08:40
>>365
(疎結合の)クラスタ範囲にまで並列化する
(普通のマルチコア・マルチCPU(どっちも共有メモリ)範囲の(半)自動並列化ならGHC本体だけでもできる)
そんなハード持ってなければどっちみち関係ない
371:デフォルトの名無しさん
07/12/17 22:55:51
____
/ \
/ ─ ─\ 今年もあと一ヶ月だお・・・
/ (●) (●) \
| (__人__) | ________
\  ̄ ./ .| | |
ノ \ | | |
/´ | | |
| l | | |
ヽ -一ー_~、⌒)^),-、 | |_________|
ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | |
/ ̄ ̄ ̄\
/ ─ ─ \
/ (●) (●) \. 俺はこの一年間何をしていたんだろう
| (__人__) | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・
\ ` ⌒´ /
/ \
372:デフォルトの名無しさん
07/12/17 23:18:53
このスレは相当に有意義だと思うんだけどな。
つうか基本的に専門スレしか見ない人も多いと思うんだが。
今年も大変勉強になりました。
373:デフォルトの名無しさん
07/12/22 18:46:23
いまさらだが、
>>96
JavaScriptでもできるな
374:デフォルトの名無しさん
07/12/22 20:49:40
(>>=´∀`)
375:デフォルトの名無しさん
07/12/22 23:20:06
そこで具体的な事じゃなく漠然と「有意義な事」って言葉しか出ないなら
2ちゃんやらなくても結果は一緒だったと思うんだよ
376:デフォルトの名無しさん
07/12/23 00:04:51
日頃から頑迷そうな意見乙
377:デフォルトの名無しさん
07/12/24 12:55:59
哲板から転載
読んだ人いる?
圏論による論理学 高階論理とトポス
清水 義夫
ISBN978-4-13-012057-9,
発売日:2007年12月中旬,
判型:A5, 232頁
内容紹介
20世紀後半,数学,計算機科学,論理学などの分野で採用されてきている圏論.
関数概念を基本として現象をとらえようというこの方法を,
関数型高階論理とトポスを題材にして丁寧に解説する.
論理学の観点を中心に,圏論の考え方を紹介するテキスト.
主要目次
序
第1章 関数型高階論理
第2章 トポス
第3章 トポスの基本定理
第4章 プルバック関手f *の右-随伴関与Πf
第5章 リミット、空間性トポス、限定記号
結び
付録1 A∧( ) ┤A⊃( )のイメージ的理解
付録2 各章の課題
主な記号一覧/索引
378:デフォルトの名無しさん
07/12/24 12:57:43
>>377
立ち読みしたが、俺らには全く関係ないよ
379:デフォルトの名無しさん
07/12/24 12:59:29
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●不合格●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。
これは本当です。やらないと一年無駄になります.
私も最初は嘘だと思ったんですが、一応コピペしました。それで第一志望に合格出来ました。
けどコピペしなかった友達がA判定とっていたのに、おちたんです。(慶応合格h.sさん)
俺はもうE判定で記念受験だったんだけど、コピペを10回くらいした途端に過去問が
スラスラ解けるようになって、なんと念願の開成に受かりました。(開成合格r.kくん)
これを今年の試験前に見てシカトしたら、入試でミスって最悪です。(n.aさん)
380:デフォルトの名無しさん
07/12/24 16:34:29
tasukete
381:デフォルトの名無しさん
07/12/24 16:37:43
>>380
通報しますた
382:デフォルトの名無しさん
07/12/25 08:38:38
>>378
関係ないことないだろ。
Haskellの型システムを理論的に理解する時など。
383:デフォルトの名無しさん
07/12/25 08:51:28
しみろん、懐かしいな…
384:デフォルトの名無しさん
07/12/25 11:43:56
すげー久しぶりに しみろん 見た…
385:デフォルトの名無しさん
07/12/26 19:57:10
liftM と fmap が一致しない場合ってあるの?
386:デフォルトの名無しさん
07/12/26 21:11:49
>383-384
東大OB乙
387:デフォルトの名無しさん
07/12/28 18:50:21
二ヶ月ほど前に撮った写真です
場所はバトルロワイヤルの撮影地にもなった
軍艦島での一枚です。
URLリンク(www.uploda.net)
撮影し現像した物を
心霊写真がないかな~っと面白半分で探していると
偶然にも一枚だけ物凄い写真が在りました
最初に見えたのは右下の子供の様な顔です
左にはボーっと立ち尽くし
こっちを見ている子供がうっすらと写っています
上部には青白い叫び顔があります
それだけではありません
探せば探すほど気持ち悪い顔があるのです
私は現在で約30ほどの顔を見つけました、全てこっちを見ています
探せば探すほどあまりにも出てくるので
気持ち悪くなり頭が痛くなりました
この写真ですが、ある友人に貸した所
夜に1時間程笑い声の様なものが聞こえてかなり
怖かったらしいです・・・
霊感がある方はぜひ鑑定をお願い致します。
因みに、スキャナーで高画質でスキャンした上で
見易いように画質調整をしています
ですのでファイルサイズが9MBにもなります・・・
388:デフォルトの名無しさん
07/12/28 21:23:54
>>387
スレ違い
画像処理 その10
スレリンク(tech板)
389:デフォルトの名無しさん
07/12/29 00:40:56
ワロタ
390:デフォルトの名無しさん
07/12/31 18:01:51
初心者レスです。
既出や意味不明な質問でしたらすみません。
ポイントフリースタイルって言葉がありますよね。
仮引数を無くして、関数を関数だけで定義するという意味で。
firstNLines n cs = (unlines . take n . lines) cs
上のような関数が定義されていたとして、
仮引数を減らす仮定で
firstNLines n = unlines . take n . lines
上のように書けますよね。
更に仮引数 n を無くす場合
firstNLines = (. lines) . (unlines .) . take
と書けると思うんですが
ポイントフリースタイルとなった最後の定義式を見て
理解しやすくなったとは思えないのです。
積極的に使うべきなのでしょうか。
391:デフォルトの名無しさん
07/12/31 18:07:32
わかりやすいほうでいいんじゃない?
ごちゃごちゃしてるのがいやならポイントフリーで。
392:デフォルトの名無しさん
07/12/31 19:15:14
なんでもポイントフリーにするのは難読化への道を歩んでしまいかねん。
とりあえず二つ目のfirstNLines nみたいに普通に使ううちは
型を明示してれば分かりにくくなることも無いけど、
度を過ぎた奴はコードの修正とかも考えると扱いにくいわ読みにくいわでいろいろと面倒だし、
ポイントフリースタイルが時にはポイントレス(要領の悪い)スタイルといわれることもある
ってHaskellWikiに書いてた
俺もflipとかドットとか使いまくったコードを読むのは嫌い。
でも書いてる奴からするとパズルみたいで楽しいんだろうなあ、とか。
393:389
07/12/31 19:29:48
ポイントレススタイル・・・。
書くときは頭の体操になるかもしれませんが
読む方からすると大変ですよね。
394:デフォルトの名無しさん
07/12/31 21:34:10
ポイントフリースタイルにすると点 . がどんどん増えてぜんぜんポイントフリーじゃないよ(笑
395:デフォルトの名無しさん
07/12/31 22:03:28
map ($ 3) [(+1),((-)2),(/3),(*4)] とか書くと単純なことなのになんか愉快だよね、たしかに
396:デフォルトの名無しさん
07/12/31 23:38:55
なんだその記号だらけの読みにくい奇怪なコードは
397:デフォルトの名無しさん
08/01/01 00:16:55
あけましておめでとうございます。
今年は Haskeller になれるように頑張りまふ(`・ω・´)!!
398:デフォルトの名無しさん
08/01/01 10:27:49
俺もだ!
今年こそはHaskellマスターになる
399:デフォルトの名無しさん
08/01/01 11:08:26
>>395
少し愉快になれた(゚∀゚)
400:デフォルトの名無しさん
08/01/01 17:35:39
今更だけど
>>52
の説明に感動した。
401:デフォルトの名無しさん
08/01/01 18:08:19
>>394
ポイントって確か関数合成演算子じゃなくて「値」のことだったかと
まあそれを踏まえて言ってるのかもしれないけど
402:デフォルトの名無しさん
08/01/09 00:26:20
モナド難しいよ。
みんなエディタは何使ってる?
Emacs が多いのかな。
403:デフォルトの名無しさん
08/01/09 00:50:16
現状まともにプログラミングできる環境がemacsしかない
eclipseは使いづらいし、xyzzyのhaskell-modeはバグだらけだしwindowsでしか動かないし。
404:デフォルトの名無しさん
08/01/09 00:52:19
>>402
モナドなんてHaskellではただのデータ型なんだから、別に難しいことなんかないよ。
405:デフォルトの名無しさん
08/01/09 09:01:44
>>403
vim にもあるでしょ?俺は vim 使ってるよ
406:デフォルトの名無しさん
08/01/09 11:04:47
俺は、viはほとんど使えないんだ。
設定ファイルをちょこっと編集するぐらいなら使うが、深い使い方は覚えてない。
407:デフォルトの名無しさん
08/01/09 15:34:50
>>401
ここに由来が書いてあります。
URLリンク(www.haskell.org)
408:デフォルトの名無しさん
08/01/09 17:39:13
darcs2って今までのdarcsとどう違うの
haskellの組み込み言語atomを詳しくおしえて
409:デフォルトの名無しさん
08/01/11 18:22:16
関数型初心者です。
今、SICPを少しずつ読んでるのですが、set!のようなものをHaskellがモナド化するのは
単に純粋であることに拘るからでしょうか。IORefみたいなものがset!に当たるかと思います
が、副作用アリだぞ、ということを意識させる以上のメリットとかがよく分かりません。
410:デフォルトの名無しさん
08/01/11 20:10:23
>>409
プログラマに直接メリットはない。
メリットは最適化コンパイラを作るのが楽になること。
411:デフォルトの名無しさん
08/01/12 04:05:03
関数型言語をやる人の多くは、学生も含め研究者です。
研究テーマはプログラミング言語の中でも、
意味論やプログラム解析などが多く、
そういう研究では参照の透明性が非常に有益な性質です。
たとえば、Javaで盛んに研究されているエスケープ解析も、
初期の成果では、関数型言語で行われたものが多いです。
また参照の透明性を保つことは、実務プログラマにとっても大変有益で、
プログラムの簡明さを保つことにつながります。
良く理解すれば、他の言語でも使える一つの方法論を得たことになります。
412:デフォルトの名無しさん
08/01/12 04:32:28
C99のコンパイラ作ってくれ。
413:デフォルトの名無しさん
08/01/12 04:33:24
インタープリタで頼む。CなのにGCがオプションであったりとか。
414:デフォルトの名無しさん
08/01/12 08:18:04
CINTがあるじゃないか
現状どうなってるか全く知らないけど
415:デフォルトの名無しさん
08/01/12 09:06:52
>>410-411
そんな小難しい話しなくても、評価順の決まっていない言語で副作用を使うのが
どれだけ厄介か考えれば済むことじゃないか?
416:デフォルトの名無しさん
08/01/12 09:42:37
>>409
確かに純粋であることに拘っているからという点は大きい。
しかし、それだけではなく、例えば、
Haskellではリストを使ったプログラムを書いている途中でそれを非決定性計算と
みなしてプログラムの一部を書くとか、IOに限らずモナドを気軽に使う人もいる。
そのためモナド一般を扱う便利関数(mapMとかモナド変換子とか)が多く用意されている。
IOがモナドになっているとそういった便利関数が使えるので便利。
また、モナドになっていると読みやすさのためにコードをまとめたり
移動させたりといった操作が気軽にできる。
例えば副作用のある言語で
f x = x + y + (副作用のある式)
where
y = (副作用のある式)
とかやるとどの順番で副作用が現れるかとか、yはどのタイミングで
何回評価されるのかわからない。
Haskellであればそのような問題はないので気軽にwhereにコードを
まとめたりできる。
417:409
08/01/12 11:02:27
皆さん、ご回答ありがとうございます。
>>415
そうなんですが、モナドはdo記法が可能で、これは実質手続き型の
記述ですよね。手続き型の記述が関数型言語内で可能だから、IOが
モナドになっていると思うのです。
>>416
モナド自体は演算のリレーということで分かるんですが、副作用の発生
する式をそうする理由は、上に書いたように、単に順番が保証されるのが
モナドである、という以上の理由は無い気がします。
どちらかというと、>>410さんの書いていることがメインなのでしょうかね。
418:デフォルトの名無しさん
08/01/12 12:10:33
モナドのおかげで、
CやSchemeよりコンパイラの最適化がより進むって事はないんで、
そこのところは誤解しないように。
参照の透明性から、プログラム変換しやすくなるので、
コンパイラの研究がやりやすいってだけ。
419:デフォルトの名無しさん
08/01/12 12:10:54
>>417
>単に順番が保証されるのがモナドである
違う。遅延処理ではg . f(x)でf → gと簡約されるかどうかがわからないのと同じように
¥x -> mf >>= mg でmf → mgと簡約されるかどうかはわからない。
モナド自体には「計算のリレー」の意味はあるけど「順番に実行する」意味はない。
IOモナドみたいな奴は、計算のリレーが示すその一連のIOアクションがmainに渡されたときに
(遅延しないHaskell処理系が)順番に実行することで「順次実行」を実現している。
IOがモナドになっているのは「計算がリレーの形になっている」ことを保障させるためだけ。
UnsafeInterleaveIOはIOモナドから出してすぐ入れるだけの処理だけどIOアクションが遅延するようになる。
これは計算のリレーを途中で切断したからその部分だけ順次実行できなくなったんだね。
これを使ってる関数にはgetContentsやinterleaveとかがある。
420:デフォルトの名無しさん
08/01/12 14:57:58
前に読んだことがある論文で、
HaskellのIOの実装に関する論文なんだが、
タイトルを忘れてしまった。
それらしい論文のタイトルを挙げてくれませんか?
421:デフォルトの名無しさん
08/01/12 15:08:02
俺はsimonpjのこれが面白かった。
Tackling the awkward squad:
monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell
URLリンク(research.microsoft.com)
422:デフォルトの名無しさん
08/01/12 17:23:16
>>421
これだこれだ
ありがとう
423:421
08/01/12 18:09:21
うぉー、一発的中!
ご褒美に最近読んで面白かったHaskell論文のタイトルくれ
424:デフォルトの名無しさん
08/01/14 02:35:49
URLリンク(web.yl.is.s.u-tokyo.ac.jp)
これに書かれてる、
> Ericssonによる 電話のソフトウェアを用いた一連の実験によれば、9から25倍の向上が 見られました
の部分の根拠となる論文って何?
425:デフォルトの名無しさん
08/01/14 12:27:39
2組のタプルの値を交換する関数って
標準でありますか?
exTuple (x,y) = (y,x)
みたいな感じの。無いならいいんですが・・・。
426:デフォルトの名無しさん
08/01/14 13:26:01
無いと思う。強いて言えばuncurry (flip (,))だけど。
427:デフォルトの名無しさん
08/01/14 13:39:28
なるほど uncurry ですか。
flip (,) までは考えてたんですが
ありがとうございます。
428:デフォルトの名無しさん
08/01/14 15:15:28
十進数 (e.g. [1,2]) を二進数 (e.g. [1,1,0,0]) に変換するプログラムを,
foldl を用いて書け,という問題を連休中ずっと考えてるんですが,
脳味噌が手続き型で凝り固まっていてさっぱりわかりません.
どうやって書くのか教えて頂けませんか.
429:デフォルトの名無しさん
08/01/14 15:19:02
手続き的になら書けるの?
430:デフォルトの名無しさん
08/01/14 15:26:32
教科書的に書こうとしてみたが、こんなんでいいか?
import List
-- n進数表示から整数へ
fromBaseN :: Integer -> [Integer] -> Integer
fromBaseN n ds = foldl f 0 ds
where
f acc d = n * acc + d
-- 整数からn進数表示へ
toBaseN :: Integer -> Integer -> [Integer]
toBaseN n 0 = [0]
toBaseN n x = reverse $ unfoldr f x
where
f 0 = Nothing
f x = Just (mod x n, div x n)
-- 十進数から二進数へ
decToBin :: [Integer] -> [Integer]
decToBin = toBaseN 2 . fromBaseN 10
431:デフォルトの名無しさん
08/01/14 15:30:33
>>430
教科書的なら一発でできる方法があるはずだ
432:デフォルトの名無しさん
08/01/14 20:10:49
>>431
mjd?
433:デフォルトの名無しさん
08/01/14 20:36:34
ghc6.6のころはSystem.Console.Readlineってデフォルトではいってましたよね?
当方Windowsなんですが、
久しぶりにHaskellやろうと思って6.8.2をインストールしたんだけどSystem.Console.Readlineがない・・
一年くらい前につくったインタプリタがビルドできないっす;;
にわかなのでライブラリインストールもままならないのですが、cabal-installってWindowsでも使えますでしょうか?
434:デフォルトの名無しさん
08/01/14 21:05:11
n進数→十進数をfoldlでやるならわかるけど
その逆は思いつかんなあ
435:デフォルトの名無しさん
08/01/14 22:12:17
なつめって初めて知ったけど、こんな所にも Haskell を使ってる人が居るとは面白い
URLリンク(natume.sourceforge.jp)
436:デフォルトの名無しさん
08/01/15 00:17:04
重すぎて使い物にならないけどな
437:デフォルトの名無しさん
08/01/15 00:29:35
>>433
Haskellプログラム書くならHaskell98に準拠しないと互換性なくなるぜ?
438:デフォルトの名無しさん
08/01/15 00:30:28
どなたか>>424の質問の返答をおねがいします
439:デフォルトの名無しさん
08/01/15 03:18:49
>>430
428 では無いんだが
Just (mod x n, div x n)
ここって modDiv 使った方が速いのか?
そうすると >>425 みたいなのを使うべき?
440:デフォルトの名無しさん
08/01/15 03:19:50
modDiv -> divMod
だった。ごめん。
441:デフォルトの名無しさん
08/01/16 00:40:44
>>439
divMod 使う方が速いんじゃないかな。
かといって>>425は読みにくいから
Just (r,q) where (q,r) = divMod x n
でいいんじゃない。
442:デフォルトの名無しさん
08/01/16 06:56:19
なるほど、サンクス。
443:デフォルトの名無しさん
08/01/16 11:52:42
数が小さいと分かっている時: (なおかつ実行効率が必要なら)
modとdivの計算コストは小さいから、
タプルを消費しないように書いた方がいい。
444:430
08/01/16 13:48:57
実行効率なんて全然考えてなかったよ
とりあえず実測してみた。ghc-6.8.2 -O2、入力はrandomRIO (0, 2^16)で
19.6 19.2 toBaseN
14.2 14.6 toBaseN_where
12.6 13.1 toBaseN_loop
8.6 10.8 toBaseN_case
7.9 7.0 toBaseN_loop_case
左から、%time、%alloc、関数名。_whereは>>441のやりかた。_caseはwhere節の代わりにcase式を使ったもの
_loopはreverse+unfoldrの代わりに手でループ(末尾再帰)を書いたもの
総実行時間の約1/4がGCだった
数が小さくてもdivとmodのコストが大きいな
445:デフォルトの名無しさん
08/01/16 17:30:40
無知でスマソ
末尾再帰ってことは $! を使ってるってこと?
良ければソースを見せて貰えませんか。
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
どうもありがとうございます。
調べてみます。