12/10/29 03:17:32.09
Vectorの変更不可の方は
sliceなんかするとC++でいうところの参照のベクタになるってことでいいすか?
中身のコピーはしないんですよね?
128:デフォルトの名無しさん
12/10/29 07:28:07.96
>>127
vector パッケージのドキュメントには、
Data.Vector.slice の項に次のように書かれています。
O(1) Yield a slice of the vector without copying it.
The vector must contain at least i+n elements.
もしコピーされているようなら、それはバグですね。
129:Perl忍者 ◆M5ZWRnXOj6
12/10/29 09:47:53.39
URLリンク(pbh.jp)
↑
これ解けないやつは真骨頂にクズ
ハッカーをを名乗る価値無し
海外からNinjaレベルと言われるほどの者なら簡単に解くことができる
解いてみてみ?
合ってるか確認してやるから
SHA-1とか総当りとかほざいてるようじゃ脳味噌足りてないよ
ホワイトハット気取りのお前らクズじゃJarlsbergすら解けないんだろうな
130:デフォルトの名無しさん
12/10/29 12:36:11.29
>>128
ですおね^^
131:デフォルトの名無しさん
12/10/30 11:10:57.70
政治学習
132:デフォルトの名無しさん
12/10/31 21:36:04.82
噂の『関数プログラミング入門』を買った
カバーデザインがポップでありながら品があって良い
組版もプログラミングHaskellと同じものなのですっきりしていて気が散らない
Haskellのコードに使われる等幅フォントが縦長窮屈でなく読みやすい
製本は流行りのlay-flatタイプの綴じ込みでこのへんもぬかりない
なかみはむつかしくてよくわからなかった
133:デフォルトの名無しさん
12/10/31 22:45:09.39
>>132
> なかみはむつかしくてよくわからなかった
一番感じなところだが・・・
134:デフォルトの名無しさん
12/10/31 22:46:57.40
肝心なところ
135:デフォルトの名無しさん
12/10/31 22:58:59.04
カバーデザインが非常に洗練されている「関数プログラミングの楽しみ」の前編に相当するとのことなので、
やはりデザインはいいんだな
136:デフォルトの名無しさん
12/10/31 23:54:48.87
この本開きやすいよな
フルフラット製本って言うらしいけど
137:デフォルトの名無しさん
12/11/01 05:42:51.18
フルスロットル製本に空目した
138:デフォルトの名無しさん
12/11/02 02:24:17.75
RWHより簡単かどうかだけ知りたい
139:デフォルトの名無しさん
12/11/02 12:11:09.02
諸君、議論がお留守だ
140:デフォルトの名無しさん
12/11/02 13:45:46.44
>>7
ほんとにjsやpythonってそんなひどいん?
141:デフォルトの名無しさん
12/11/02 14:04:31.23
>>7
■Objective-C
for (id num in @[@1,@2,@3,@4,@5]) printf("%d\n", [num intValue]);
または
for (id num in @[@1,@2,@3,@4,@5]) NSLog(@"%@", num);
142:デフォルトの名無しさん
12/11/02 14:17:55.79
Pythonでリスト内包表記使ってないのは不公平だな
■Python
[x*2 for x in range(1,6) if 2<x<5]
143:デフォルトの名無しさん
12/11/02 15:31:54.92
>>7て一番酷いのはHaskellだろ
こんな阿呆なコード書くやつ居ないよ
144:デフォルトの名無しさん
12/11/02 15:33:46.22
畜生、Vectorにnub無いのかよ
145:デフォルトの名無しさん
12/11/02 19:20:30.90
nub って何?
146:デフォルトの名無しさん
12/11/02 19:20:48.30
>>7って [1, 2, 3, 4, 5] みたいなリストを用意するのがルールじゃないの?
range とか 1..5 はだめだろ
147:デフォルトの名無しさん
12/11/02 20:48:54.42
Conal Elliott のブログの写真って、最近変わった?
つい最近まで正面を見てなかったっけ
まぁ、どうでもいいが
この素敵なおっさん、いつになったらブログ更新するんだろ
148:デフォルトの名無しさん
12/11/03 00:05:40.15
>>138
RWHは泥臭く実例を追う実用主義。BirdのIFPHは、理論的な側面を強調している。
無限リストの挙動がなんでそーなるの的な数学的原理なんかはIFPHが優れてるし
画像を扱ってバーコードリーダー作るぜ⇒大量のボイラープレート⇒それモナドでまとめられるよ
なんて話はRWHの優れたところだ。
コンピュータサイエンス(数学寄り)の素養があるならIFPHが簡単だろうし
CとかPerlは実戦でつかえるけど理論には興味ないしそれでも関数型使ってみたいならRWHが向いてる。
149:デフォルトの名無しさん
12/11/03 00:11:37.14
モナド変換子を解説してる日本語書籍がRWHしか無くないかね?
現実的にHaskellを使いこなすにはモナド変換子の理解が必須だと思うのだけど
150:デフォルトの名無しさん
12/11/03 00:27:58.18
>>149
IFPHの10.4でモナド変換子の説明が載ってますぞ~
例外の複合、状態の複合を例として説明し、最後にそれらを応用してますぞ~
151:デフォルトの名無しさん
12/11/03 00:38:59.61
それならちょっとIFPH立ち読みしてくるかなあ
よさそうなら関数プログラミングの楽しみと一緒に買ってしまうか
関数プログラミングの楽しみの方は、いつかじっくり読みたいなとは思ってたんだ
152:デフォルトの名無しさん
12/11/03 00:48:45.35
丁度昨日IFPHと関数プログラミングの楽しみ併せて買ってきたわ
読みたい時に手に入らないとかありがちだからなー
153:デフォルトの名無しさん
12/11/03 04:55:02.03
>>145
リストの重複要素を省く
154:デフォルトの名無しさん
12/11/03 12:08:13.58
>>153
ありがと
155:デフォルトの名無しさん
12/11/03 18:50:29.18
モナドって、IO、継続、Stateなどの副作用系から、LISTや冪集合などの
数学系に至るまで、適用範囲がすごく幅広いのだが、これはどうしてだろうか?
これだけ幅広くても、モナドとは何かを言えるものだろうか?
156:デフォルトの名無しさん
12/11/03 18:53:32.65
またモンゴロイドが疑問を抱いてるようです
157:デフォルトの名無しさん
12/11/03 18:57:39.06
>>155
関数ほどは幅広くはないよ
でも関数とは何かを言えるものだろうかなんて誰も疑問に思わないな
158:デフォルトの名無しさん
12/11/03 19:22:34.41
>>157
関数。たしかにそうだけどね。
モナドは中途半端に幅広い、と言うとどうかな。
関数の場合は、モナドのような分類(IO、State、...)はしないよね。
しかもこの分類はアドホックな分類にも見えるし。
159:デフォルトの名無しさん
12/11/03 19:45:48.97
>146
>7のClojureはrange使ってるよ
160:デフォルトの名無しさん
12/11/03 19:51:21.33
>>155
Prologは副作用系と数学系を区別してなかったのだが
Haskellはいったん副作用系と数学系を対立させ、再び統一するためにモナドを発明した
161:デフォルトの名無しさん
12/11/03 20:43:47.80
>>160
うん。そのとき、たとえば、IO a とList a における IOとListには、
どちらも型構成子であるという共通性はあるが、それ以外の共通性は
感じ取れないんだ。さらにいうと、List aの方はaの自然な拡張だと
すんなり納得できるが、IO aの方は、aとIOの強引な組合せとしか
見えないんだ。
162:デフォルトの名無しさん
12/11/03 20:58:35.33
>>159
前スレのテンプレを見てもらえばわかるがrangeとか1..5とか使ってないのよ
だから元々そういう縛りがあったんだろう
163:デフォルトの名無しさん
12/11/03 21:01:56.52
あれはテンプレじゃなく前スレで勝手にぶっこまれただぞ
164:デフォルトの名無しさん
12/11/03 21:09:19.21
>>163
それは失敬
でもテンプレ化するならそれなりにルールを決めないとだめだよね
165:デフォルトの名無しさん
12/11/03 21:10:54.68
>>161
お前には感じ取れなくてもListとIOには共通性があって
その共通性に基づいてるのがモナドなんだな
166:デフォルトの名無しさん
12/11/03 21:11:34.99
え聞こえないとかありがちだからなー
167:デフォルトの名無しさん
12/11/03 21:15:23.85
「感じる」とはまた曖昧で主観的な・・・
168:デフォルトの名無しさん
12/11/03 21:28:01.97
>>165
>ListとIOには共通性があって
どういう共通性?
169:デフォルトの名無しさん
12/11/03 21:29:04.57
モナドとは、モナド則を満たすような(>>=)とreturnを定義できる型構築子のこと
逆に、ある型構築子に対してモナド則を満たすような(>>=)とreturnを定義できるならそれはモナド
170:デフォルトの名無しさん
12/11/03 21:35:43.05
IOとかListとかが実際に果たす役割はどうでもよくて、共通する構造によって表現可能ってことだから 関数よりむしろモナドのほうが広いとも言える
171:デフォルトの名無しさん
12/11/03 21:43:13.59
>>169
むしろ、IOとListとが同類にみえるようなモナド則は実はナンセンスなのじゃ
ないかという疑問なのだが?
>>170
さすがにそんなことはないだろう。
172:デフォルトの名無しさん
12/11/03 22:04:53.50
>>169
そのような性質を持つものにモナドという名前を与えた背景の方が興味あるな
173:デフォルトの名無しさん
12/11/03 22:05:36.02
>>171
モナド則なんてなくても、Prologでは副作用と非決定性は同類に見えていた
174:デフォルトの名無しさん
12/11/03 22:15:51.32
>>172
お察しの通り、モノイドとの類似性から
>>173
非決定性が副作用の一部というなら分かるが、同類というのは分からん。
Prologの何のことを言ってる?
175:デフォルトの名無しさん
12/11/03 22:22:16.53
非決定性と副作用を同類に扱う手法のひとつがモナドだよね?Prologには何かそれに代わる物がある?
176:デフォルトの名無しさん
12/11/03 22:23:16.60
>>171
ナンセンスとか言っても現実にリストとIOは同じモナドの概念でまとめられるので、
まとめられる以上それを別のものにする理由が無い
177:デフォルトの名無しさん
12/11/03 22:29:00.77
IOはRealWorldを状態に持つStateモナドのようなものだってことは理解してる?
178:デフォルトの名無しさん
12/11/03 22:36:14.23
Prolog:
非決定性は副作用の一部 (>>174)
Haskell:
非決定性はモナドの一部 + 副作用はモナドの一部
179:デフォルトの名無しさん
12/11/03 22:37:13.01
まとめられるから、というだけでモナドにまとめている訳でもなさそうだけどな
まとめられるのに、諸事情でまとまっていないものもあるし
180:デフォルトの名無しさん
12/11/03 22:40:44.12
でも、非決定性、状態、継続、例外、入出力等、
かなり多くのものがまとめられるからモナドを選んだんじゃないのかね?
181:デフォルトの名無しさん
12/11/03 22:49:35.35
色々やってるうちに便利なことに気付いたって印象だな
IOとか昔はモナドじゃなかったんでしょ
182:デフォルトの名無しさん
12/11/03 22:54:29.24
流体は非粘性(粘度効果は無視できる)、ポリトロープな状態方程式で記述される熱的な理想気体とし、断熱過程の下で作用する。
183:デフォルトの名無しさん
12/11/03 23:01:50.05
応用範囲が広くて便利なものを「ナンセンス」と言う意味が分からんな
独自の言葉の使い方をしてるならちゃんと最初に定義してくれ
184:デフォルトの名無しさん
12/11/04 00:05:52.82
>>155
Moggiの論文に説明があるよ。でもまあ確かに判ってる人が
判ってる人向けに書いてる感がある。
185:デフォルトの名無しさん
12/11/04 00:09:40.59
>>171
さすがにそんなことはないだろう、なんてことはないのだ。
恒等関手もモナドなのでモナドによって定まるKleisli圏の中に元の圏も
含まれている。形式的な話ではあるが。勿論モナドごとに一つのKleisli圏があり、異なる
モナドをつなぐためにはめんどうな事をしないといけないが
(この辺は自分もまだ未把握。モナドトランスファーが関係してるのかなぁ)
186:デフォルトの名無しさん
12/11/04 00:41:32.78
コアンダ効果を通常の翼の速度分布の説明に使うのは不適切であると
187:デフォルトの名無しさん
12/11/04 04:30:56.21
駄目だ! このスレ頭良い人達でいっぱいだ!
188:デフォルトの名無しさん
12/11/04 07:59:40.61
>>185
そういう言いかたなら、関数は射なのだから,やっぱりそんなことはないのだ。
189:デフォルトの名無しさん
12/11/04 09:31:56.97
>>188
射は関数とは限らないから、それは反論になってないよ(ただ185の議論が強引なのは確か)
190:デフォルトの名無しさん
12/11/04 09:59:30.19
プログラムとは関数では無くKleisli圏の射のことなので、
関数よりモナドの方が広いと言うのはある意味正しい
191:デフォルトの名無しさん
12/11/04 10:13:46.42
>>185
いまここではそもそもそのKleisli圏がどれだけ意味があるのかを聞かれているんじゃないかな
192:デフォルトの名無しさん
12/11/04 10:22:17.47
>>190
米田の補題より、関数=射。
190より、モナド⊂プログラム=Kleisli圏の射⊂射。
したがって、モナド⊂関数。
これでOK?
193:デフォルトの名無しさん
12/11/04 10:36:35.07
諸君、議論しているね
194:デフォルトの名無しさん
12/11/04 10:56:48.43
>>192
>米田の補題より、関数=射。
ちょっと意味が解らないんだけど、
米田の補題からどうやって関数=射(ここで言うイコールって何?)が導かれるのか説明してくれない?
195:デフォルトの名無しさん
12/11/04 13:53:18.43
むしろ、カルテジアン閉のような気がする
196:デフォルトの名無しさん
12/11/04 15:51:14.41
>>189
強引?
間違ってるっていうんだよw
197:デフォルトの名無しさん
12/11/04 16:08:25.97
Q. 何でIOと[]の共通部分をわざわざ括り出して名前を付けるの?
A. 便利だから
で済む話だろ
198:デフォルトの名無しさん
12/11/04 16:21:23.88
Moggiの論文読めば済む話なのに、何をごちゃごちゃ言ってるのんだよ
199:デフォルトの名無しさん
12/11/04 16:59:49.49
英語を読んだら死ぬという噂だし…
200:デフォルトの名無しさん
12/11/04 17:41:22.96
>>197
IOをモナドで扱うのが便利なのは分かるが、
リストまで同じようにモナドで扱うのが便利な理由がいまいち分からん
201:デフォルトの名無しさん
12/11/04 17:43:30.65
>>198
だからあMoggi論文が納得できないって言ってるんだろ
それはそれでありだな
202:デフォルトの名無しさん
12/11/04 17:43:44.71
>>200
内包表記便利じゃん
あれってモナドだからだよ
203:デフォルトの名無しさん
12/11/04 18:03:37.92
>>195
:(;゙゚'ω゚'):カルテジアンなの? カルテシアンだと思ってた
204:デフォルトの名無しさん
12/11/04 18:09:09.26
コードも書かずにモナドがどうやら大して理解もしてない圏論がどうやら、
実にHaskellerらしいスレですね
205:デフォルトの名無しさん
12/11/04 18:12:53.23
圏論を深く理解したHaskellerでもなさそうなあなた様が
このような場末に何の御用で
206:デフォルトの名無しさん
12/11/04 18:23:29.00
>>200
リストモナドは総当たり(深さ優先探索)するときに使う
問題によってはStateT s []がすごく便利
207:デフォルトの名無しさん
12/11/04 18:48:07.95
>>202
リスト以外で内包表記が役に立つ(適している)シーンが思い浮かばない
リストもモナドで括る利点が内包表記ができるってだけなら、
内包表記はリスト専用構文でもいいような気がするのだが
208:デフォルトの名無しさん
12/11/04 18:51:07.34
>>206
すまん、総当たり(深さ優先探索)する簡単な具体例は何か無いだろうか
(俺、ここでいう総当たりの意味がよく分かっていない)
リストがモナドになっていない他の言語と比較してみたい
209:デフォルトの名無しさん
12/11/04 18:57:56.15
つうかモナド内包表記っていつのまにか復活してたのか
210:デフォルトの名無しさん
12/11/04 19:07:30.55
Listモナドが何なのかもわかってなくて煽ってたのかこいつは
Listの各要素に関数を適用するmap程度のものだとか思ってたのか?
211:デフォルトの名無しさん
12/11/04 19:12:23.22
いろんな書き方が出来て楽しいのう
do { x <- xs; y <- ys; return $ x + y }
[x + y | x <- xs, y <- ys]
(+) <$> xs <*> ys
212:デフォルトの名無しさん
12/11/04 20:02:05.01
>>211
一番下の知的な書き方に憧れます
213:デフォルトの名無しさん
12/11/04 20:51:41.09
>>210
それ以外に効果的だと感じる内包表記の使い方を見たことがない
214:デフォルトの名無しさん
12/11/04 21:03:01.89
わかってるじゃないか
お前が見たことないだけだよ
215:デフォルトの名無しさん
12/11/04 21:12:11.35
>>211みたいなの見てるとリストの要素から別のひとつの要素作ってるだけだから、
あんま効果的に見えないんだな
リストモナドの場合、
要素からリストをつくる操作(リストが入れ子になるわけじゃないよ)とか
要素を排除する操作とか(途中ですべての要素が排除されたら処理は止まる)を混ぜることができて、
最終的に結果をひとつのリストとして得ることができる
216:デフォルトの名無しさん
12/11/04 21:13:48.86
総当りというかバックトラックの例だが。
nQueen :: Int -> [[(Int,Int)]]
nQueen n = nQueen_ 1 [[]]
where nQueen_ m ans
| m > n = ans
| otherwise = nQueen_ (m + 1) [(m, x) : xs |
xs <- ans,
x <- [1..n],
all (\ (i, j) -> x /= j && abs (m - i) /= abs (x - j)) xs]
217:デフォルトの名無しさん
12/11/04 21:14:33.43
4つの4で0..100を作るパズル
import Data.List
import Control.Monad
main = putStr $ unlines $ map (intercalate ", " . take 2 . fourFours) [0..100]
fourFours :: Int -> [String]
fourFours target = do
(val, str) <- msum $ map makeWith [[4,4,4,4], [44,4,4], [4,44,4], [4,4,44], [444,4], [4,444], [4444]]
guard $ val == fromIntegral target
return str
makeWith :: [Int] -> [(Rational, String)]
makeWith [x] = return (fromIntegral x, show x)
makeWith xs = do
(left@(_:_), right@(_:_)) <- zip (inits xs) (tails xs) -- xsを二つに分ける
leftVal <- makeWith left -- 左部分式を作る
rightVal <- makeWith right -- 右部分式を作る
combine leftVal rightVal -- 演算して組み合わせる
combine :: (Rational, String) -> (Rational, String) -> [(Rational, String)]
combine left right = do
op <- [add, sub, mul, div] -- 演算を選ぶ
op left right
where
add a b = return $ op2 (+) "+" a b
sub a b = return $ op2 (-) "-" a b
mul a b = return $ op2 (*) "*" a b
div a b = do
guard $ fst b /= 0
return $ op2 (/) "/" a b
op2 valOp strOp (v0, s0) (v1, s1) = (valOp v0 v1, "(" ++ s0 ++ ")" ++ strOp ++ "(" ++ s1 ++ ")")
218:デフォルトの名無しさん
12/11/04 21:24:26.05
君らがやってるのはトイプログラムとか頭の体操の類いだけじゃん
たとえばゲーム製作の**の部分での利用とか、
会計ソフト製作での**の部分での利用とか、
Webサービス製作での**の部分での利用とか
そういう実用的な部分での使い方はねーの?
219:デフォルトの名無しさん
12/11/04 21:26:14.32
いつからそんな話になったんだよww
220:デフォルトの名無しさん
12/11/04 21:30:31.40
jQueryなんかはListモナド的なものをうまく活用してるいい例かね
Listモナドのアルゴリズムはわりと広範囲に応用可能だと思う
状態モナド的なものと比べて
221:デフォルトの名無しさん
12/11/04 21:30:39.00
>>218
なんで総当たりの実演をするのにそんな分野依存の知識を要求する例が欲しいんだ?
リストモナドは総当たりが必要な時にはいつでも使える、ということさえ知ってれば
プログラマなら応用できるだろ
222:デフォルトの名無しさん
12/11/04 21:34:13.80
まあでもはっきり言えばリストモナドは実用上そこまで重要じゃないと思う
Maybeの方が10000倍大事
223:デフォルトの名無しさん
12/11/04 21:35:36.79
カードをプレイするためのコストが比較的複雑なTCGで、
手札のカードが場に出せるかどうかを判定するのにStateT a [] bを使ったような記憶はある
224:デフォルトの名無しさん
12/11/04 21:48:05.17
>>219
いや、だってさ
実用的なシーンではたいして使えない仕組みなんて、
あっても意味は無くないか?
何のためにプログラムしてるかと言えば、
アプリを作るためにしてる、というのが
まぁ一般の大半のプログラマの意見だと思うし
225:デフォルトの名無しさん
12/11/04 21:50:01.24
あと、俺の言う仕組みって、リスト以外のモナド内包表記のことね
226:デフォルトの名無しさん
12/11/04 21:55:28.18
>>224
いや、>>208に答えてリストモナドがどんな感じで動くかという話をしてるんであって、
リストモナドの存在意義を示すための例じゃないよ
227:デフォルトの名無しさん
12/11/04 21:56:42.71
>>225
お前は誰だよw文脈依存な書き込みするならコテつけろw
228:デフォルトの名無しさん
12/11/04 21:59:12.10
モナドの出番だな
229:デフォルトの名無しさん
12/11/04 22:18:45.82
>>226
だったらアンカーを適切に付けろ
こっちはモナドを勉強中なんだから何に対しての何の意見なのか全く分かんねーよ
で本題だが、すいませんでした、>>216 は参考になります
これから他の言語と比較して理解を深めようと思います
230:デフォルトの名無しさん
12/11/04 22:32:03.03
リストがモナドである意味が分からないのか、
内包表記がリスト以外のモナドで使える意味が分からないのか、
それとも他に難癖付けてるのか
レスが錯綜してて分からん
231:デフォルトの名無しさん
12/11/04 22:37:52.14
非リストのモナド内包表記の活用例というのは俺も見てみたい
実際使ったことがない
232:デフォルトの名無しさん
12/11/04 22:43:10.02
>>230
> リストがモナドである意味が分からないのか、
これはとても難しい問題だと直感したから、ひとまず置いておく。
> 内包表記がリスト以外のモナドで使える意味が分からないのか、
まずはこれを知りたい。
しかも、意味は難しいそうだから、まずは例を。
遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
233:デフォルトの名無しさん
12/11/04 23:02:36.40
>>222
>Maybeの方が10000倍大事
Maybeが?ほんまかいな
234:デフォルトの名無しさん
12/11/04 23:07:02.43
> ほんまかいな
メイビー(キリッ
235:デフォルトの名無しさん
12/11/04 23:09:02.03
センスNothing
236:デフォルトの名無しさん
12/11/04 23:17:29.69
好きな書き方で書けば良いよ
if y /= 0 then Just (x / y) else Nothing
do { guard (y /= 0); return (x / y) }
guard (y /= 0) >> return (x / y)
[x / y | y /= 0]
237:デフォルトの名無しさん
12/11/04 23:37:47.36
いろんなライブラリ内で Maybe が使われているのを見るが、
[x / y | y /= 0] のような書き方を見ないのは何故だ?
238:デフォルトの名無しさん
12/11/04 23:38:52.87
モナド内包表記が復活したのって最近でしょ?
239:デフォルトの名無しさん
12/11/04 23:43:08.50
可読性もありそう
240:デフォルトの名無しさん
12/11/04 23:50:31.34
そんなキモい書き方するのなんてゴルファー()ぐらいたろ
241:デフォルトの名無しさん
12/11/04 23:51:42.79
モナドのインターフェースを持ってるから、>>211みたいに
do形式や内包表記さらにはアプリカティブファンクターの式なんかの好きな書き方ができるんだよね
242:デフォルトの名無しさん
12/11/04 23:53:14.08
>238
復活といっても GHC の言語拡張ですよ。
if y /= 0 then Just (x / y) else Nothing
[x / y | y /= 0]
どちらがプログラムの意味を理解しやすいかは読み手の経験によるでしょうが、
私は前者の方を使いたいですね。
243:デフォルトの名無しさん
12/11/05 00:01:01.45
内包表記をリスト以外に使うのがキモいのなら
> 内包表記がリスト以外のモナドで使える意味が分からないのか
なんて訊くまでもないよね。
だって使えるかどうかに関わらずキモいから使わないんでしょ?
244:デフォルトの名無しさん
12/11/05 00:26:31.37
>>243
>>323
> 遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
[x / y | y /= 0] これが遊びでないと言うのなら、>>237 はどう説明する?
なぜ書籍ではこのような書き方が紹介されない?
俺は内包表記がリスト以外のモナドで使えるのは、意味なんて何も無いと思う。
最初は、モナドだとどんなものでも内包表記ができちゃう事を発見したから、
プログラマがなんか役立つ使い方をしてくれるだろうという安直な考えで、
リスト以外にも使えるモナド内包表記が作られたんじゃないかな。
設計者自身に明確な目的なんてきっと無いでしょ。
その後、たいして上手い使い方も無いまま復活した理由が不明だが。
245:デフォルトの名無しさん
12/11/05 00:43:08.53
結論ありきなら議論する意味なんて無いってだけだよ。
ていうか、書籍に書いてあるかどうかで判断したいなら
こんなとこで他人に聞く必要もないだろ?
246:デフォルトの名無しさん
12/11/05 00:49:09.20
>>244
なんでリストで内包表記が使えるのは意味があるの?
do構文があれば要らないよね?
247:デフォルトの名無しさん
12/11/05 00:49:49.28
>なぜ書籍ではこのような書き方が紹介されない?
そりゃ自分で書いてる通り、最近復活したからでしょ
そのうちリスト以外でもイディオムが生まれてくるよ
248:デフォルトの名無しさん
12/11/05 04:01:00.46
>>236
:(;゙゚'ω゚'):内包表記って[と]で括られてるからリスト専用だと思ってた……
今までは偽りの人生だった……
249:デフォルトの名無しさん
12/11/05 04:08:25.37
本に書いてあって現場で使われているものにしか興味ないなら
スレ間違えてるよな
250:デフォルトの名無しさん
12/11/05 04:19:05.02
エロゲの攻略法わかんなくてゲームの意義を問う
というかZIPでくれと言い出す奴
251:デフォルトの名無しさん
12/11/05 05:35:28.68
サワーグレープセオリー
252:デフォルトの名無しさん
12/11/05 06:23:16.95
ghciだと:set -XMonadComprehensionsでモナド内包表記が有効になるのか
これはなかなかおもしろいな
253:デフォルトの名無しさん
12/11/05 06:36:23.36
>>252
詳しい解説サンクス
それならPerl忍者が荒らすのも分かる気がする(´・ω・`)
254:デフォルトの名無しさん
12/11/05 07:21:11.08
>>249
じゃあ、本は無しにしようか。
現場に限ってもいいし、
何なら HackageDB に登録されているライブラリ内に限定してもいいが、
それでもスレ違いか?
プログラム言語において機能を実装するというのは、
使うことによってメリットがあると想定されるからだろう。
Haskell は実用もしっかりできる関数型言語を目指して生まれたのだから、
なおさらだ。
Haskell98 で言語仕様から消えたモナド内包表記が、
最近になってGHCの言語拡張として復活したのは、どういう意図があって?
モナド内包表記が欲しいと思っていた人たちは、
どういうシーンでそれが活用できると考えていたの?
その辺りが知りたい。
正直言って、>>236 の例では恩恵が実感できない。
「好きな書き方で書けば良い」という理由だけで復活したとも思えん。
それでは Perl みたいじゃないか。
255:デフォルトの名無しさん
12/11/05 07:28:03.96
内包表記なんて長いコードに使うもんじゃない
(長くなるならmapなりfilterなりdoなり使うべき)
だから短いコードだから内包表記で書く意義が
分からないってワケじゃないだろう
ってことは、こっちは>>254様が納得する理由をエスパーしてやらなきゃ
ダメってことなワケだが、なんでそんなことしてやる必要あるの?
256:デフォルトの名無しさん
12/11/05 07:28:37.24
>>254
>>247
257:デフォルトの名無しさん
12/11/05 07:49:04.08
>>254
URLリンク(hackage.haskell.org)
URLリンク(hackage.haskell.org)
258:デフォルトの名無しさん
12/11/05 12:01:23.74
サーセン
Data.Vectorで組んで動いたコードをData.Vector.Unboxedに切り替えようと思ったんすよ
そしたら急にVectorはファンクタじゃないからfmap使えないよ Probable fix 云々ってクレーム来たんすけど
どゆことっすか?ファンクタでしょ?
259:デフォルトの名無しさん
12/11/05 15:54:09.94
>>258
メッセージ全文うpらないのは甘え
260:デフォルトの名無しさん
12/11/05 19:08:43.11
>>257
ありがと。
前者は単にモナド内包表記と同等の do 表記をいくつか例示してるだけじゃん。
誤解を恐れずに言えば、モナド内包表記の操作的意味論っぽいものを示してるだけ。
ただ、そのページに論文「Bringing Back Monad Comprehensions」へのリンクがあった。
こっちはざっと見たところ「現実的な問題提起 --> モナド内包表記による解決」
という感じで語っているような気がするから、実用的なことが書かれていそうだ。
これからじっくり読んでみるよ。
後者の方はこの論文と同名なんだが、同じもの?
至る所に訂正の跡があるのだが、最新版ってことかな?
どちらにしても、「Bringing Back Monad Comprehensions」
こういう情報が欲しかったんだ。
261:デフォルトの名無しさん
12/11/05 19:12:58.71
>>258
unboxed vectorは関手じゃないよ(腹が立つのは分かる)
関手なら fmap :: (a -> b) -> Vector a -> Vector b
が定義できなきゃならんけど、unboxed vectorだとb=Integerとかにできない
(Unbox制約を満たさないといけないから)
262:デフォルトの名無しさん
12/11/05 19:21:08.08
最近流行ってる関手って、そもそも何?
263:デフォルトの名無しさん
12/11/05 19:24:41.98
URLリンク(www.haskell.org)
Haskellでいう関手はこれ
圏論の関手は他を当たってね!
264:デフォルトの名無しさん
12/11/05 19:29:59.09
>>261
マジすか
複雑な事情っすね
実践よりもHaskell型システムの理解に的を絞ったサイトないっすか?
265:デフォルトの名無しさん
12/11/05 19:30:38.26
>>262
map を関手の一つと考えると、関手から自然変換まで簡単に理解できる
簡単に理解できる = 毎日30分定義とにらめっこして1週間ぐらい悩むと分かる
266:デフォルトの名無しさん
12/11/05 19:41:26.25
>>263
Functor クラスが関手のことなら、なにも漢字で書かなくてもよくない?
unboxed vector は Functor クラスのインスタンスじゃないから、
と言う方がはるかに分かりやすいというか、ストレートだと思うんだが
と感じるのは私だけ?
267:デフォルトの名無しさん
12/11/05 19:44:20.77
知らんがな
268:デフォルトの名無しさん
12/11/05 19:52:07.99
>>266
定着してる訳語があるのに横文字や片仮名を使うのは宗教上の理由でできんのです、ごめんなさい
269:デフォルトの名無しさん
12/11/05 19:55:12.71
>>268
ギャグとしてはあまり面白くない
270:デフォルトの名無しさん
12/11/05 20:02:00.78
女だ! このスレに女が紛れ込んでるぞぉーっ!
魔女を焼き払えーっ!
271:デフォルトの名無しさん
12/11/05 20:04:44.17
一人称を私にすると賢そうに見えるの法則
272:デフォルトの名無しさん
12/11/05 20:14:25.77
ん?
Functor クラスそのものは関手なの?
Functor クラスがたまたま持つ性質(種数やfmap関数など)を持つものが関手なの?
たとえば Applicative なども関手?
Functor クラス自身とそのインスタンスのみが関手?
Functor クラスそのもののみが関手で、そのインスタンスは集合の要素みたいなもの?
わけが分からなくなった・・・
>>271
一人称「私」なんて誰でも使うから、賢そうに見える要素にならないでしょ
273:デフォルトの名無しさん
12/11/05 20:20:11.08
>>272
二番目が一番近いと思う
274:デフォルトの名無しさん
12/11/05 20:24:02.72
>>273
そうだとすると、>>268 の言う「定着してる訳語」っておかしくないか?
>>268 の言い方だと Functor の日本語訳が関手である、
と言っているように聞こえる
275:デフォルトの名無しさん
12/11/05 20:29:18.54
>>274
圏論でFunctorの訳語が関手だから、それ以外に訳しようがない
276:デフォルトの名無しさん
12/11/05 20:33:04.72
圏論でFunctorと、haskellのFunctorクラスは同じもの?
277:デフォルトの名無しさん
12/11/05 20:38:18.43
わかった
今後Haskellのファンクタの意味で関手といいたい場合
いわゆる関手
と書くことにしよう
278:デフォルトの名無しさん
12/11/05 20:39:30.80
>>276
HaskellのFunctorクラスのインスタンスはある種の(圏論的な意味の)関手(の対象部分)になってる
具体的にはHask圏からHask圏への関手
逆に、ある型構築子が(圏論的な意味の)関手になっていてもFunctorのインスタンスとは限らない
たとえば>>258のunboxed vectorがそう
279:デフォルトの名無しさん
12/11/05 20:48:17.32
>>278
じゃあ、HaskellのFunctorクラスを安易に関手と言うのは、
文脈によっては危険じゃないか?
どの文脈だと危険か正しく理解してる奴しか使えない訳語な感じがするが
280:デフォルトの名無しさん
12/11/05 20:53:08.78
>>279
もちろん混乱の原因になることはあるけど、
*Functorのインスタンスを関手と呼ぶ
のをその論法で禁止したら、
*Monadのインスタンスをモナドと呼ぶ
*Monoidのインスタンスをモノイドと呼ぶ
*Numのインスタンスを数値型と呼ぶ
あたりも言えなくなって不便じゃないか
281:デフォルトの名無しさん
12/11/05 20:53:32.47
単位元と結合律を保存する高階関数は関手
という理解は正しいでしょうか?
282:デフォルトの名無しさん
12/11/05 20:59:21.14
>>281
「恒等関数と関数結合を保存する高階関数」と言った方が良さそう
283:デフォルトの名無しさん
12/11/05 21:09:19.73
関手はFunctorではなくfmapじゃないのん?
284:デフォルトの名無しさん
12/11/05 21:12:51.87
>>280
なるほど、そう言われると、たしかに不便だな。
Haskell の話をしていると判りきっている時には
Monad のインスタンスはモナドと言いたい。
(個人的にはFunctorのインスタンスはファンクタと言いたいが)
でも、Haskell の話をしてるときに、いきなり圏論が姿を現し、
そのまま議論が進んでいくと、ややこしくならない?
そういうシーンをこのスレでよく見かける
285:デフォルトの名無しさん
12/11/05 22:05:15.91
271 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/05(月) 20:04:44.17
一人称を私にすると賢そうに見えるの法則
賢くみられたいからHaskellやるという法則
286:デフォルトの名無しさん
12/11/05 22:11:23.06
賢く見られたいからHaskellって・・・
賢く見られたいんならMITで博士号取るだろ普通
287:デフォルトの名無しさん
12/11/05 22:47:19.80
>>286
ギャグとしてはあまりおもしろくない
288:デフォルトの名無しさん
12/11/05 22:51:06.92
>>287
一度目はいいけど、二度やると冷める
もう止めた方がいいと思うよ
289:デフォルトの名無しさん
12/11/05 23:09:11.87
GHC 7.6.1 の ghci 上で Conduit が動かない
ghci 上で Data.Conduit系モジュールがロード処理されると、
エラーが出る。
Loading package conduit-0.5.2.7 ... linking ... <interactive>: internal error: R
_X86_64_PC32: High bits are set in 7fefb411866 for _close
(GHC version 7.6.1 for x86_64_unknown_mingw32)
Please report this as a GHC bug: URLリンク(www.haskell.org)
これはバグ?
俺英語書けなくてバグ報告できないんだが、詰んだかな
290:289
12/11/05 23:10:49.65
あ、ちなみに ghc でコンパイルすれば問題なく実行できるから、詰んではないか
でも色々実験して勉強しようと思ってたんだが、ghci 使えないとなると、
かなり面倒になるなぁ・・・
291:デフォルトの名無しさん
12/11/05 23:12:17.93
>>281-283
関手とはある圏の対象と射をもう一つの圏(自己関手の場合は同じ圏)に移すものだから、
Functorのインスタンスとfmapセットで関手と言うのが一番近い
292:デフォルトの名無しさん
12/11/05 23:37:08.23
>>286=こいつ図星
こいつ>>285のレスに図星しすぎれレスしてやがる
だいたいのやつは必死に悔しくても反応したら負けっていう考え持ってるから食いつかない
こいつは食いついた正直者
293:デフォルトの名無しさん
12/11/05 23:41:21.48
>>290
たぶんWindows固有の問題
LinuxかMacを使うとか、Windowsなら仮想マシン上でLinux使えば、問題が出ない可能性が高い
この手の開発はUnix系メインでやっててWindowsはオマケのことが多いから、
細かいとこで目の行き届かない不具合があったりする
294:デフォルトの名無しさん
12/11/05 23:41:35.04
俺、Haskellぐらいしかまともに書ける言語ないんだが、
正直それはそれで非常に恥ずかしい思いをしている
295:デフォルトの名無しさん
12/11/05 23:41:49.81
○○をしたら負けとか偉いやつが言ったらすぐ真似をして
○○をしなくなるのが情弱
Matzみたいなのが「これから来る言語」 Haskellとか言ったら
すぐ真似して
Haskellしだすやつが情弱
>>286=こいつ最高に図星
296:デフォルトの名無しさん
12/11/05 23:44:42.21
Haskellの話しようぜ
297:289
12/11/05 23:45:16.42
>>293
ありがと
とりあえず勉強だけなら処理速度は要らないから、
vm player に linux 入れて、そっちでやってみるよ
298:デフォルトの名無しさん
12/11/06 00:53:45.21
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
299:デフォルトの名無しさん
12/11/06 07:18:02.31
教育してもらわなきゃプログラミングすら出来ないアホは
まったく向いてないからリアル土方に転向したほうが良いよ?
300:デフォルトの名無しさん
12/11/06 07:31:54.96
侮辱がただの賛意表明になっているような
元からそのつもりだったのか?
いや、そういう文体には見えないなあ
要するに>>299はアホなんだろう
301:デフォルトの名無しさん
12/11/06 07:33:11.89
え?まじで教育が必要なの?
大学でも別にプログラミングなんて独学だっただろ?
え?大学行ってないの?
302:デフォルトの名無しさん
12/11/06 07:34:45.38
俺が言いたいのは>>298と>>299って同じ主張じゃね?
ってこと
ほんとに大学行ってるの?
303:デフォルトの名無しさん
12/11/06 07:36:37.37
>>298は「教育環境揃ってない = 実用度外視」
と書いてるようにしか読めんのだが
教育されなきゃ実用的なプログラミングも出来ないアホは向いてないよ
304:デフォルトの名無しさん
12/11/06 07:41:52.94
話通じてないなあ・・・
自分の発言にあとから留保つけちゃってるし
まあ俺は>>298じゃないからいいんだけどさ
305:デフォルトの名無しさん
12/11/06 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし
306:デフォルトの名無しさん
12/11/06 07:48:21.06
GHCはRuby以下の安定性
307:デフォルトの名無しさん
12/11/06 09:29:03.76
∧_∧
( ´Д`) <みなさーん、お茶が入りましたよ~
/ \
| l l | ..,. ., .,
| | | _|。.:_::゜。-.;.:゜。:.:;。
ヽ \_ .。'゚/ `。:、`;゜:;.::.。:.:。
/\_ン∩ソ\ ::..゜:: ゚。:.:.::.。.。:.
. / /`ー'ー'\ \ ゜: ::..゜:: ゚。:.:.:,。:.:.
〈 く / / ::..゜:: ゚。:.:.:,.:.:.:。:.:,
. \ L ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:,
〉 ) ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
(_,ノ .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
308:デフォルトの名無しさん
12/11/06 10:19:19.89
298 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 00:53:45.21
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
305 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし
309:デフォルトの名無しさん
12/11/06 10:58:32.92
Matzってそれほど「偉いやつ」だっけ
310:デフォルトの名無しさん
12/11/06 14:23:00.82
Perl忍者最近見ないな
311:デフォルトの名無しさん
12/11/06 17:31:28.63
>>261
じゃあfmap的なことはどう実現したらいいんですか!?
312:デフォルトの名無しさん
12/11/06 18:24:59.42
>>311
Data.Vector.Unboxed.map
313:デフォルトの名無しさん
12/11/06 19:07:44.24
>>312
(////)
314:デフォルトの名無しさん
12/11/06 19:14:05.47
(////) ::
315:デフォルトの名無しさん
12/11/06 23:10:36.99
(////) :: Answer -> Shame
316:デフォルトの名無しさん
12/11/08 19:52:02.96
質問です。Writerモナドというものを知ったので、前から知りたかった
遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。
import Control.Monad.Writer
tak :: Int -> Int -> Int -> Writer (Sum Int) Int
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
tak (fst(runWriter(tak (x - 1) y z)))
(fst(runWriter(tak (y - 1) z x)))
(fst(runWriter(tak (z - 1) x y)))
これで動くは動くんですが、引数を色々変えてもカウントが高々3でした。
少し考えてみて、再帰で呼んだ結果のカウントを捨ててるせいだろうというのは分かったのですが
改善策が思いつきません。上手い書き方があったら教えてもらえないでしょうか。
また、もしWriterでカウントするのが無理だとしたらどうするのが定石でしょうか?
317:デフォルトの名無しさん
12/11/08 20:03:07.81
入門書のリスト内包表記にガードが使えるという下りを読んで、凄い衝撃を受けた。
もしかしてHaskellって、Prologよりも抽象度が高いのかも。
実際にプログラムを作るまでになれば、泥臭いこともいろいろあるんだろうけど。
318:デフォルトの名無しさん
12/11/08 21:19:45.25
>>316
関数の評価回数を知りたいだけでしたら、プロファイリングすれば簡単にわかりますよ。
コンパイル時に3つのオプション "-rtsopts -prof -auto-all" を付けて、
実行ファイルの起動時にRTSオプション "+RTS -p" を付ければ、
*.prof ファイルができるんで、それを読めばいいです。
prof ファイルの一番下の表を見てください。
1列目に関数名(変数も関数)、2列目にモジュール名とあって、
4列目の "entries" の項目が評価回数です。
例えば z を返すバージョンの tak 関数を使って、
main :: IO
main = do
let z = tak 3 2 1
print z
を上記のようにコンパイルして実行してできた prof ファイルを見ると、
tak の評価回数は 5 と表記されています。
(実際に手計算で let z = tak 3 2 1 を簡約すると、
確かに5回 tak 関数が評価されていることが確認できます)
プロファイリングの詳細は「本物のプログラマはHaskellを使う」
の第45回の記事を参考にしてください。
こういうことではなく、プログラムの中でカウントする仕組みを作るには、
という趣旨の質問でしょうか?
319:デフォルトの名無しさん
12/11/08 21:33:42.67
>>316 こうすればok
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
x' <- tak (x - 1) y z ;変えた
y' <- tak (y - 1) z x ;変えた
z' <- tak (z - 1) x y ;変えた
tak x' y' z' ;変えた
320:デフォルトの名無しさん
12/11/08 21:46:20.04
>>316がやりたいのは"遅延評価された場合"だからWriterだとマズイかも
321:デフォルトの名無しさん
12/11/08 21:46:32.28
>>318
すみません、書き忘れました。
仰る通りプログラムの中でカウントする仕組みを作るには、という趣旨です。
>>319
それをやると遅延評価の場合と結果変わっちゃいませんかね?
322:319
12/11/08 21:57:07.69
すいませんでした。orz
snd(runWriter(tak 100 50 0))とかやると糞時間かかりますね。
あとここちょっと違ってます。
| x <= y = do
tell(Sum 1)
return y; 変えた
323:319
12/11/08 21:59:19.20
ああごめん。>>322の最後は無視して。orz
324:デフォルトの名無しさん
12/11/08 22:33:46.28
>>316
Haskellは純粋だから、評価順序によって違う値を返す関数は書けない。遅延評価を前提とした呼び出し回数を数えるには、明示的に遅延評価をエミュレートする必要がある
import Control.Applicative
import Control.Monad.ST
import Data.STRef
thunk :: ST s a -> ST s (ST s a)
thunk action = do
ref <- newSTRef Nothing
return $ do
cache <- readSTRef ref
case cache of
Just val -> return val
Nothing -> do val <- action; writeSTRef ref (Just val); return val
tak :: STRef s Int -> ST s Int -> ST s Int -> ST s Int -> ST s Int
tak counter ex ey ez = do
modifySTRef counter (+1)
x <- ex; y <- ey
if x <= y
then ey
else do
a <- thunk $ tak counter (pred <$> ex) ey ez
b <- thunk $ tak counter (pred <$> ey) ez ex
c <- thunk $ tak counter (pred <$> ez) ex ey
tak counter a b c
takCount :: Int -> Int -> Int -> Int
takCount x y z = runST (do
counter <- newSTRef 0
_ <- tak counter (return x) (return y) (return z)
readSTRef counter)
325:324
12/11/08 22:35:38.37
あれ2chの仕様変わったの…
実体参照は適当に戻してね!
326:デフォルトの名無しさん
12/11/08 22:36:17.95
>< (//)
327:デフォルトの名無しさん
12/11/08 22:53:32.55
>>324
ありがとうございます、言い切ってもらえると参考になります。
今すごいH本をやっと読み終わろうかという段階なので正直難しいですが、
そのうち理解できるように精進します。
328:デフォルトの名無しさん
12/11/08 23:43:06.04
>>325
インデントは全角空白派が大勝利で悔しい
仕様変更の経緯のわかるスレとかあればどなたかプリーズ
329:デフォルトの名無しさん
12/11/09 13:58:18.49
ランタイムのGCっていつ行われるの?
アイドル時にやってくれる?
330:デフォルトの名無しさん
12/11/09 18:56:23.67
>>329
メモリが足りなくなったら
331:デフォルトの名無しさん
12/11/09 19:22:04.75
-threaded付けてるならアイドル時にもやる
332:デフォルトの名無しさん
12/11/09 19:22:21.31
>>330
今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……
こうはならないの?
333:デフォルトの名無しさん
12/11/09 19:23:42.68
>>331
あり^^
334:デフォルトの名無しさん
12/11/09 21:15:13.21
今日 -XTransformListComp なるものの存在を知ったんだけど
これって需要あるの?
{-# LANGUAGE TransformListComp #-}
import GHC.Exts (groupWith)
xs = [1,3,4,5,7,9,10,11,13]
ys = [x | (x,y) <- zip xs [1..], then group by x-y using groupWith]
335:デフォルトの名無しさん
12/11/11 15:48:20.65
conduit-0.5.2.7 を使っています。
ライブラリドキュメントの Data.Conduit にチュートリアルがありますが、
sourceList [1..10] $$ fold (+) 0 これの結果がどうなるか調べる方法を探しています。
チュートリアルでは、恐らく ghci 上で上記の式を評価して、
55 という数字が標準出力に出力されている様子が描かれていると思いますが、
私は Windows で GHC 7.6.1 を使っているため、ghci で conduit が使えません。
試しに次のようにしてみても、コンパイルエラーが出ます。
a :: GSink Int IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = print a
--------------------------------
No instance for (Show (Pipe l0 Int o0 u0 IO Int))
arising from a use of `print'
--------------------------------
どうすればチュートリアルのように
sourceList [1..10] $$ fold (+) 0 の評価結果を数値または数字で得る、
あるいは標準出力へ出力することができるでしょうか。
336:355
12/11/11 16:02:03.19
>>355
これでできました。
a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = do
a <- runPipe a
print a
なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。
337:335
12/11/11 16:02:48.97
すいません、レス番間違っていました。
>>335 です。
338:デフォルトの名無しさん
12/11/11 18:20:04.17
皆さんの思うハスケルの他の言語に対する優位性はなんですか?
339:デフォルトの名無しさん
12/11/11 18:25:43.15
conduit-0.5.4ならsourceList [1..10] $$ fold (+) 0で大丈夫だった
それよりWindowsのghc7.6.1ではghci上でconduitが使えないというのが気になる
340:デフォルトの名無しさん
12/11/11 18:53:17.01
>>339
>>289 >>290 >>293 辺り
341:デフォルトの名無しさん
12/11/11 19:02:24.58
>>339
7日に 0.5.4 が公開されていたんですね(その前日にDLしてました)
今 0.5.4.1 にアップデートして、
sourceList [1..10] $$ fold (+) 0 の値を print してみましたが、
コンパイルエラーでした。
大丈夫だったというのは、どのようにやったのでしょうか。
342:デフォルトの名無しさん
12/11/11 19:07:49.53
>>338 普段感じる利点はこのあたり
大域的な型推論
直和型が簡単に表現できる(CのunionやOOPLのsubtypeと比べて)
パターンマッチ(網羅性チェック、分岐と値の取り出しを同時に行える、など)
副作用のある箇所が型により分離される
(LLとかよりは)実行速度が速い
343:デフォルトの名無しさん
12/11/11 19:10:49.18
ほむほむ。
344:341
12/11/11 19:11:52.88
>>339
あぁ、分かりました。
(sourceList [1..10] $$ fold (+) 0) >> print
こういう事ですね。
これならできました。
もしかして、これならアップデートしなくてもできていたかも知れません。
ところで、conduit を 0.5.2.7 から 0.5.4.1 へ
"cabal install conduit" でアップデートしたのですが、
ライブラリドキュメントの方はこれでは更新されないのでしょうか。
(デフォルトなら ・・・/AppData/Roaming/cabal/doc/index.html
にインストールされるものです)
ドキュメントの表記の方は 0.5.2.7 のままなんです。
345:341
12/11/11 19:18:31.91
>>344
誤 (sourceList [1..10] $$ fold (+) 0) >> print
正 (sourceList [1..10] $$ fold (+) 0) >>= print
ライブラリドキュメントの方はトップの目次のところだけでなく、
内容も、例えば Data.Conduit のページの上部にも
"conduit-0.5.2.7: Streaming data processing library."
と書かれていて、更新されていません。
こういうものなのでしょうか。
Cabal のパッケージのバージョンは、
(規則に従うなら)4つ目の番号の変更は、
互換性は保っているがAPIが変更されている事になるので、
ドキュメントも変更しないとまずいような気がするのですが・・・
346:デフォルトの名無しさん
12/11/11 20:02:42.53
ghciで
λ> sourceList [1..10] $$ fold (+) 0
って入力しただけだけど 省略 >>= printと同じ事か
ドキュメンテーションが更新されないのは多分haddockのバージョンとghcのバージョンが違うから生成に失敗してるとかが考えられる
347:341
12/11/11 20:46:24.73
>>346
> 省略 >>= printと同じ事か
なるほど、たしかに。
> 多分haddockのバージョンとghcのバージョンが違うから
haddock.exe は ghc 7.6.1 に元々入っているのですが、
これが違うという事でしょうか。
ちなみに、ghc の bin ディレクトリには haddock.exe とは別に、
haddock-7.6.1 という名前の謎のファイルもあります。
(バイナリエディタで見てみると、形は実行ファイルの様ですが)
どうも、ghc 7.6.1 は謎の挙動かちらほらとありますね・・・
348:デフォルトの名無しさん
12/11/11 22:43:59.93
インストールした直後にcabalでconduit入れた時になんかhaddockのバージョンがおかしいって警告出たから
cabal install haddockで入れなおしたらconduitのドキュメント作ってくれるようになった
これはcabal/binにhaddockがあるからそっちが優先されるのが原因だけど
349:デフォルトの名無しさん
12/11/12 02:11:31.23
>>342
Javaのような言語で書かれた業務アプリ、ドカタの世界にもこれから進出してきたりしますかね
350:デフォルトの名無しさん
12/11/12 06:17:52.78
>>349
早くて20年後ぐらいじゃね?
351:デフォルトの名無しさん
12/11/12 20:15:17.94
Javaで書かれた商用ソフト見たことがない
ハードについてるドライバは何度かある
352:デフォルトの名無しさん
12/11/12 20:22:24.00
>>351
俺はひとつだけ知ってる
astah*
Haskell で書かれた商用ソフトってあるんかな
うちは社内ツールではあるけど
353:デフォルトの名無しさん
12/11/12 20:29:59.56
そういえばperlやjavascriptで書かれた商用ソフトも見たこと無いな。
354:デフォルトの名無しさん
12/11/12 20:33:15.19
コンパイルできない言語ってソースをそのまま売ることになると思うけど、それって商売になるのだろうか
355:デフォルトの名無しさん
12/11/12 20:37:06.13
ソースを売れっていうのは普通にあるでしょ
356:デフォルトの名無しさん
12/11/12 20:43:17.14
Android 用有料アプリは Java で書かれた商用ソフトである
という認識でいいのか?
357:341
12/11/12 22:44:21.87
>>348
Haddock を cabal install で入れてから、
cabal install --reinstall Conduit してもダメでした。
(ghc\bin ディレクトリより cabal\bin ディレクトリの方が
優先的に検索されるように設定しましたが・・・)
cabal\bin の Haddock.exe を ghc\bin へコピーしてみましたがダメでした。
よく見たら、cabal\doc 内には conduit-0.5.2.7 と conduit-0.5.4.1 があったので、
conduit-0.5.2.7 の方を適当にリネームして、index.html もリネームし、
この状態で cabal install --reinstall Conduit してみたら、
ドキュメントの目次やコンテンツの Conduit のバージョンが
ちゃんと 0.5.2.7 に更新されました。
Haddock の更新は必要条件だったのかよく分かりませんが、
とりかくドキュメントが正しく更新できて良かったです。
お騒がせしました。
358:デフォルトの名無しさん
12/11/13 20:32:21.56
>>351
Minecraft
359:デフォルトの名無しさん
12/11/14 13:53:30.81
何だよ
type family Mutable v :: * -> * -> *
Mutable v s a is the mutable version of the pure vector type v a with the state token s
って
リワハじゃ習わなかったぞ
360:デフォルトの名無しさん
12/11/14 15:21:27.75
トップレベルの関数の型宣言で
Unbox a => ……としたとして
letやwhereと続けた内部関数にも型宣言をつけるとします
このとき、その宣言でもトップレベルの a と同じ型を指定する為にはどうしますか?
361:デフォルトの名無しさん
12/11/14 18:30:25.04
関数を生成する関数 :: Unbox a => 内部関数の型 -> トップレベル関数の型
トップレベル関数 = 関数を生成する関数 内部関数 where 内部関数 = …
362:デフォルトの名無しさん
12/11/14 19:30:01.00
>>360
Lexically scoped type variables の事かな
363:デフォルトの名無しさん
12/11/19 07:06:57.78
関数内使わないほうが読みやすく感じる
whereって必要ですか?
364:デフォルトの名無しさん
12/11/19 07:07:41.13
s/関数内/関数内の関数定義/
365:デフォルトの名無しさん
12/11/19 07:37:36.32
さすがに一時束縛なしはハードモードでないの? letのほうが読みやすいということもあまりないでしょう
366:デフォルトの名無しさん
12/11/19 08:06:27.68
関数内関数は自由変数が多くて理解するのが難しいです
トップレベルの関数に持ち上げてしまって、モジュールの機能で外部からは隠して、
自由変数になっていたところは明示的に引数として渡すほうが良いのではないかと
367:デフォルトの名無しさん
12/11/19 08:09:12.81
ケースバイケースなんで
whereが要る要らないの話にはならないと思う
368:デフォルトの名無しさん
12/11/19 08:13:31.56
それはね、長い関数が読み難いだけなんだよ
369:デフォルトの名無しさん
12/11/19 18:06:19.91
自由変数の追いにくさと引数渡しの煩雑さを天秤に掛けた結果、
多くの人はwhereを大量に使うことを選択している
何を読み難いと感じるかは個人差が大きいから、
多数派と違う感性を持ってると生きづらいね
という結論が嫌なら、「読みやすく感じる」よりも客観的な論拠を挙げてください
370:デフォルトの名無しさん
12/11/20 00:03:10.08
プログラムは書くことより読むことのほうが難しいし読むことの方が多い
whereはプログラムを書きやすくできるが読みにくくする
whereを使うのは甘え
371:デフォルトの名無しさん
12/11/20 06:58:26.14
>>366
関数内のスコープに限定するより
モジュール内スコープに広げた方が読みやすい?
頭大丈夫?
372:デフォルトの名無しさん
12/11/20 07:07:32.45
>>370
頭の中で、読みにくいコードを読みやすいコードに書きかえればいいだろ
それができる人は読むことより書くことが多い
373:デフォルトの名無しさん
12/11/20 07:38:40.46
>>363
末尾再帰覚えてない人かな?
where使わず書いたら、引数の数が違うだけで同じ機能の関数が沢山出来上がってしまう
sum ns = sum' ns 0
where
sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
whereが無ければsum関数とsum'関数の両方が関数を使う側に公開されるか、末尾再帰関数作る度にモジュール書き換えが必要になる
374:デフォルトの名無しさん
12/11/20 08:10:24.50
sum ns = let sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
in sum' ns 0
375:デフォルトの名無しさん
12/11/20 09:16:11.00
>>372
君、仕事でプログラム書いたことないでしょ?
376:デフォルトの名無しさん
12/11/20 09:29:43.91
どっちも同じだと思えば両方読めるようになるのに、ノイズが気になって読めない
ノイズが少ない方が優れているといってノイズばかり見ている
雑音を無視したら優劣の概念がなくなってしまう
優劣を気にするとデジタルが読めなくなる
377:デフォルトの名無しさん
12/11/20 09:57:34.35
仕事でHaskell使った事ないわーw
378:デフォルトの名無しさん
12/11/20 14:25:22.30
そもそも、お前がいう「仕事」って、受注開発(の賃金労働)のことだろ?
自分で作ったサービスで始める仕事(ビジネス)だったら、言語はなんだっていいんだよ。
ドヤ顔で「仕事でhaskell使ったことないわ」とか恥ずかしすぎるわw
379:デフォルトの名無しさん
12/11/20 14:26:08.12
会社に小遣いもらってる分際が偉そうに、と思うね。
380:デフォルトの名無しさん
12/11/20 14:45:50.00
仕事で戦車使ったことないわ
381:デフォルトの名無しさん
12/11/20 15:35:16.08
ああ、Haskellerってこういうのばっかなのね
382:デフォルトの名無しさん
12/11/20 16:26:57.23
まだ平和な方のスレですよ
383:デフォルトの名無しさん
12/11/20 18:16:34.72
>>366
トップレベルにリフトすれば自由変数が減るかのような錯覚はどこからきた?
384:デフォルトの名無しさん
12/11/20 18:21:28.91
さすがに>>378-379は引くわ
385:デフォルトの名無しさん
12/11/20 18:30:03.16
関西型プログラミング言語
386:デフォルトの名無しさん
12/11/20 18:49:25.20
なんでやねん
387:デフォルトの名無しさん
12/11/20 22:50:08.77
Haskell使う案件ってどこに行けばあるんだろうな。
388:デフォルトの名無しさん
12/11/20 23:02:02.53
Haskell を使う事案が発生しました
389:デフォルトの名無しさん
12/11/21 01:14:53.06
>>387
大学
390:デフォルトの名無しさん
12/11/21 07:23:50.52
>>387
実際にどのような仕事があるか知らんが、
君には "haskell commercial OR industry" でググる知恵はないのか
391:デフォルトの名無しさん
12/11/21 09:17:06.66
ちえをくれ
392:デフォルトの名無しさん
12/11/22 02:43:01.30
おいおい、haskell使った仕事が貰えないなら、
自分で始めればいいだけだろ。
仕事を作るのも仕事のうち。
393:デフォルトの名無しさん
12/11/22 06:04:12.01
ま、自分が知らないからって無いで押し切るのは
一つの生き方ではあるわな
394:デフォルトの名無しさん
12/11/22 07:38:46.45
>>392
いや、維持保守を引き継ぐ人たちがHaskell使えないのに
Haskellのソースを残すわけには行かないだろ。
395:デフォルトの名無しさん
12/11/22 09:54:55.62
Cに変換して納品