1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ] 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/ Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
213 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 02:12:55 ] >>208 どんなバックグラウンドをもってる?関数型言語についての経験は? 手続き型の国の人ならば、わかりにくいところやね。 関数を変数でもたすってのは関数型では日常茶飯事なんですわ。 そこに便利さのヒントがアルよ。
214 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:57:49 ] map (\(a, b) -> a+b) [(1,1), (2, 3) ..]
215 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:56:31 ] >>213 手続きの国からワープしてきたのですが 関数を変数にするならポインタ渡せばよくないですか? そうすれば、定義しても渡せますよね?
216 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:20:46 ] 名前があってもなくてもポインタ渡すのです 関数オブジェクトは、メソッドがひとつしかないクラスのインスタンス、に似ています インスタンスに名前がついているとは限らないのです
217 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:33:06 ] >>216 よくわからないぉ もう少し詳しく説明してぉ?
218 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:43:32 ] 無明関数…悟りでも得たいのか?
219 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:46:43 ] >>218 間違えただけだぉ気にしないで
220 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:47:44 ] >>218 悟りは得るものではなく開くものです。
221 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:06:14 ] 名前を考えるのが面倒くさい 再利用しない 定義している箇所を探すのが面倒くさい 関数内部の処理が簡潔 のときは無名関数使いたくならないか?
222 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:14:34 ] つーか、関数本体そのものずばりを一覧できる状態で渡しているのにわざわざ名前をつける必要があるのだろうか
223 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:28:02 ] カリー化 (new Satori(x)).open(y)
224 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:43:21 ] 無名関数で再帰するにはどうすればいいですか たとえば、 f n = if n == 1 then 1 else n * f (n-1) はどのように書けばいいですか?
225 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:46:45 ] fix (\f n -> if n == 1 then 1 else n * f (n-1)) むみょーん。Haskellian じゃないから fix があるかどうかシラネ
226 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:49:20 ] 型無し言語なら (\f -> f f) (\f n -> if n == 1 then 1 else n * f f (n-1))
227 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:54:26 ] あー、でも f って名前つけちゃったな
228 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:11:01 ] >>225-226 ここはHaskellのスレですよ
229 名前:初心者修業中 mailto:sage [2008/06/07(土) 13:17:55 ] >>225 Control.Monad.Fix にありますね。 fix :: (a -> a) -> a fix f = let x = f x in x
230 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:22:40 ] >>224 不動点演算のfixを使うようです。 Prelude> Control.Monad.Fix.fix(\f n -> if n == 1 then 1 else n * f (n-1)) 5 120
231 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:00:44 ] (\y f -> f (y f)) (\y f -> f (y f)) (\y f -> f (y f)) (\y f -> f (y f)) ...
232 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:16:56 ] >>224 ... f ... where f n = if n == 1 then 1 else n * f (n-1) 局所的な関数定義で代わりになるんじゃないの、というのはダメかな
233 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:01:17 ] >>232 に同意
234 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:19:36 ] 名前が付いてるからダメ
235 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:37:58 ] ... (f where f n = if n == 1 then 1 else n * f (n-1)) ... こうかー
236 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:21:15 ] >>235 whereが作るのは式じゃなくて節だから使える場所が決まってる(定義の後とかcase選択肢の後とか) ... (let f n = if n == 1 then 1 else n * f (n-1)) in f) ... ならおk
237 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:22:54 ] 閉括弧が一個多かった ... (let f n = if n == 1 then 1 else n * f (n-1) in f) ...
238 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:46:25 ] The Haskell School of Expressionで勉強してます。 この本の解答集のようなもの、ネットには無いでしょうか。 www.elbeno.com/haskell_soe_blog/ ↑このページは参照してますけど、11章までなので、全部が まとまったのがあると嬉しいです。
239 名前:デフォルトの名無しさん [2008/06/16(月) 14:44:56 ] ポイントフリースタイルについて質問なんですが、 Haskellでは原理的にどんな関数でもポイントフリースタイルに 変形可能なのでしょうか。
240 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:00:34 ] うん
241 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 18:48:23 ] >>239 Sコンビネータとかもポイントフリーに出来るんだっけか?
242 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 18:52:01 ] どの範囲の関数まで使用を認めるかによるな >>241 Control.Monad.ap :: (Monad m) => m (a -> b) -> m a -> m b を(->) rモナドについて使えば、Sコンビネータそのもの
243 名前:デフォルトの名無しさん [2008/06/17(火) 22:58:00 ] ポイントフリーのポイントって何? 何が自由なの?
244 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:28:00 ] ポイント = initial objectからのarrow ポイントフリースタイル = ポイントを使わない関数定義
245 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:11:23 ] (Monad m) => m (a -> b) -> m a -> m b これって未だによくわからないけど 手計算できそうな実例ないですか?
246 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:28:46 ] あんまり意味ないけど↓こんなのとか? f :: Monad m => m (a -> b) -> m a -> m b f mg mx = do { g <- mg; x <- mx; return $ g x } test1 = f Nothing (Just 1) test2 = f (Just succ) (Just 2) test3 = f (Just id) Nothing test4 = f [] [] test5 = f [id] [5] test6 = f [id, succ, (* 2)] [6, 9]
247 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 09:12:38 ] GHC 6.8.3リリース
248 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 11:53:17 ] ナイス
249 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 14:40:13 ] >>244 initial object(始対象)じゃなくて terminal object(始対象)だお。 集合の圏で terminal object からの arrow というと一点集合に相当する。 集合の圏では任意の一点集合 x に対して f x = g x ならば f = g 「point(一点集合)を使わずに関数が等しいことを表現できる」=>「ポイントフリー」ということだと思う。
250 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 18:25:28 ] >>249 失礼、書き間違えた。 terminal object(終対象)だな。
251 名前:249 mailto:sage [2008/06/18(水) 18:26:24 ] × terminal object(始対象) ○ terminal object(終対象) だった。
252 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 11:33:25 ] 俺やべぇ 気がついたらポイントフリースタイルで5行も書いてたぜ これはもはや関数型スパゲッティだな
253 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 12:48:07 ] 任意のλ式はSKコンビネータで書き換えられるとか言うのを見て 実際に適当なλ式で変換してみたら出てきた式はとても読める 代物ではなかったのを思い出した
254 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:00:42 ] ありゃ一種の難読化だよな
255 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:06:18 ] >>253 SKコンビネータも、名前付きにできると若干読みやすそうだけど。 っていうか、それが出来たら、どんな高級言語とも変らんという話になって、逆に面白さがないか。
256 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 19:22:12 ] >>255 そこでunlambdaですよ!
257 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 00:27:42 ] >>255 つ super combinator
258 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:45:00 ] 以下の関数fをもっと簡単にする方法ありませんか? f [] = [] f (_:[]) = [] f (x:xs) = (x, head xs) : f xs
259 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:52:53 ] 簡単に、というより再帰を使わずにできませんか?
260 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 18:05:14 ] f xs = zip xs (tail xs)
261 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 18:15:27 ] f xs = zip xs (drop 1l xs)
262 名前:261 mailto:sage [2008/06/23(月) 19:03:55 ] すまん。tail の l を残してしまった。 f xs = zip xs (drop 1 xs)
263 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 19:21:38 ] zip [] ⊥ = [] らしいから>>260 と>>261 は等価かな こういうのを意識しないといけない場面だと非正格性が気持ち悪い
264 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 00:09:28 ] >>263 ⊥って勃起してるのw?
265 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 01:03:13 ] いやむしろ tail で書けて気持ちいいだろ。
266 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 06:18:25 ] >>265 でも zip (tail xs) xs と zip (drop 1 xs) xs は等価じゃない つまり、zipでは第一引数が先に評価されるということを覚えていないといけない分、ややこしい (厳密には評価順の問題じゃなくて「zipは第一引数について正格で第二引数について非正格」ということだけど)
267 名前:デフォルトの名無しさん [2008/06/24(火) 07:48:57 ] >>266 どういうこと? 例えば f (x1 : x2 : x3 : xs) -> x1 + x3 だったら、引数のリストの最初の要素と3番目の要素について正格ってこと?
268 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 08:32:09 ] >>267 そういうつもりで「正格」という言葉を使った
269 名前:初心者修業中 mailto:sage [2008/06/24(火) 09:53:02 ] 関数結合の(.)って優先順位が高いので、 どうしても括弧が増えて見ぐさい気が…。 こんなのがあったら便利だと思うんですけど、 ↓ infixr 1 $. ($.)=(.) こんな感じ ↓ sigma = tail $. scanl (+) 0 標準ではなさそうなんですが、 やっぱ、問題ありですかね?
270 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 09:55:22 ] 慣れの問題
271 名前:初心者修業中 mailto:sage [2008/06/24(火) 10:13:14 ] ああ、勘違いしてました。 関数の優先順位はどの演算子よりも上ですね。 これで問題ないのか ↓ sigma = tail . scanl (+) 0 >>270 レスありがとうございます。 早く慣れたいです。 まだ、頭で考えないとよくわからない。 (考えてもわからない時ありw)
272 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 11:35:10 ] >>266 「厳密には」も何も最初っからそう
273 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 12:56:24 ] >>266 > 覚えていないといけない 覚えてなくてもプログラム書くのにはなにも困らない。 等価性とか考えだすと全部正格のほうが楽かもしれんけど。
274 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:23 ] >>273 書くときは良くても読むとき困る 例えば>>260 のコードが空リストに対しても正しく動作するかどうか確かめるのに、 いちいちPreludeの仕様を読まないといけない zipみたいに明確な定義のある関数ならまだいいけど、 例えばhPutStrLn undefined ""の値が 1. ⊥ 2. 実行時にエラーになるアクション 3. ()を返すアクション のどれになるかは仕様では決まっていないはずで、ちょっと厄介
275 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 15:42:16 ] >>274 その辺は想像で読めば十分じゃない? zip xs (tail xs) とあって、 コードを書いたのが信頼できる人なら、 zip は第二引数について非正格なのだろうな、とか。 hPutStr undefined "" も、 hPutStr _ "" = return () と定義されては無いだろうし、 undefined が正しいハンドルじゃないからと hPutStr が独自にエラーを出すというのも、 先に undefined が評価されるから有り得ないだろう、とか。 hPutStr (error "1") (error "2") にしても error "1" だろう、とか。
276 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 15:49:33 ] ム板のやつらはなんでこんなに視野が狭いんだろうといつも思う。
277 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 17:38:53 ] 3の場合 main「ちょっと undefined に "" 出力してこい」 hPutStrLn「へい」 ...数十ns後 hPutStrLn「やってきやした」 main「おまwwww改行どうしたwwwwwwww」 >>276 正直くだらないネタ以外はここではなく他の所に書く。
278 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 18:27:02 ] 質問です HaskellでGPGPU関連の話題ってありませんか?
279 名前:274 mailto:sage [2008/06/25(水) 20:23:02 ] すまん、hPutStrLnじゃなくてhPutStrじゃないと話が合わないな >>275 >コードを書いたのが信頼できる人なら、 勉強のためにコードを読んでるならいいけど、 レビューとかデバッグとかしてるならそうはいかないだろ >hPutStr が独自にエラーを出すというのも、 誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする 実行した時点でundefinedが評価されてエラー発生ね でも、例えば最適化のために hPutStr h s = seq h $ ... みたいな実装になってたら1.だし、 hPutStr h s = mapM_ (hPutChar h) s みたいな定義が考えられる以上3.もあり得なくはない 結局、非正格がデフォルトなせいで関数の仕様に書かなければいけない事項が多いのが問題 それを不用意にうやむやにすると関数の振る舞いが実装に依存してしまう それほど頻繁に問題になることではないけど、たまに面倒
280 名前:275 mailto:sage [2008/06/25(水) 21:28:51 ] >>279 > レビューとかデバッグとかしてるならそうはいかないだろ うん。 > hPutStr h s = mapM_ (hPutChar h) s > みたいな定義が考えられる以上3.もあり得なくはない なるほど。 > それほど頻繁に問題になることではないけど、たまに面倒 そういうこったね。
281 名前:275 mailto:sage [2008/06/25(水) 21:32:14 ] > 誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする > 実行した時点でundefinedが評価されてエラー発生ね そういうつもりでしたか。 ちなみにそれだと1.はどういうつもりだったのですか?
282 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 21:49:44 ] >>281 hPutStr undefined "" `seq` 0 を評価してエラーが発生すれば1.だよな 実際試したらHugsでもGHCiでもエラーは発生しなかった
283 名前:275 mailto:sage [2008/06/25(水) 22:26:04 ] なるほど。というか>>279 をちゃんと読んでませんでしたごめんなさい。
284 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:37:05 ] 一通りよく取り上げられる教科書は読んだんですが、Arrowなどの 比較的新しい技法についてわかりやすく書かれた文書はどの辺 でしょうか。
285 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:11:25 ] 本家から辿って論文を読むのがいいと思うよ。
286 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:16:36 ] Arrow アーーー
287 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:28:26 ] arrowねぇ・・・イマイチだねぇ・・・ プログラミング的にはこれといってメリットないよ。
288 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:23:45 ] >>284 www.haskell.org/haskellwiki/Arrow
289 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 00:05:34 ] arrowで量子コンピュータのシミュレーションやってます めっちゃべんりですっっっっs
290 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:15:42 ] ユニタリ変換の理解が一つの山かも。
291 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:22:40 ] ユニタリ変換?高校生でも知ってるよ
292 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:42:43 ] 皆さん、エディタは何使って書いてますか?
293 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:48:09 ] emacsしか選択肢ないんじゃね? eclipseは糞だし。
294 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:10:10 ] vim
295 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:45:12 ] notepad.exe
296 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 12:32:37 ] vimやemacsだと使い勝手のいいプラグインあるんでしょうか。 自分もEclipseはちょっと嫌ですねぇ。
297 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 12:44:03 ] www.haskell.org/libraries/haskell.vim その他いろいろ $ hugs -Evim
298 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 16:06:10 ] Haskellの構文解析ってどういう風な作りになってるん? 結合性宣言があったりするので、 トークン読んだ時点では構文木を作れないような気がするんだけど。 何かの資料とか、HugsやGHCでの実現方法のソースとかあったら教えてくだしあ
299 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 16:38:24 ] >>298 GHCはとりあえず全部左結合として解析(parser/Parse.y)して、 後のrenameのパスで結合性宣言をもとに組み立て直してる(rename/RnExpr.lhs)
300 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 16:57:55 ] >>292 俺もvimだわ なんか文法と相性良さげだし
301 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:16:47 ] >>299 そういう手があったか。いや、全然関係ないパーサを先日作ってたんだが。 パス(1パスコンパイラとか2パスコンパイラとかのパス)にこだわっていては 非富豪的かねぇ。
302 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 18:10:34 ] 左結合にするってのは、 とりあえずリンクトリストにしといてから、 あとでパーズしなおすって事。
303 名前:デフォルトの名無しさん mailto:sa [2008/06/28(土) 18:39:00 ] >>292 俺はAgda使ってるよ。結構使いやすい。
304 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:10:12 ] project eulerに接続できねーぞ!!! どうなってんだ糞
305 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:19:06 ] 質問です グラフの研究で路線データ(や道路のデータなど)が使いたいのですが、 そういうデータを手に入れるにはどうすればいいですか?
306 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:48 ] >>305 質問です Haskellと関係ありますか?
307 名前:298 mailto:sage [2008/06/28(土) 22:27:19 ] >>299 ,302 thx、参考になった。 細かく追えてないけど、かなりがんばらないとparseできないってことか。
308 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 08:23:28 ] とりあえず左結合って要するにS式だよね。
309 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:44:49 ] Real World Haskell www.amazon.co.jp/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/ > This easy-to-use, fast-moving tutorial introduces you to functional > programming with Haskell. Learn how to use Haskell in a variety of > practical ways, whether it's for short, script-like programs or large > and demanding applications.
310 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:44:41 ] 中身読めるよ book.realworldhaskell.org/beta/ 表紙が決まったんだね。ヘラクレスオオカブト?
311 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 03:40:51 ] 後の兜本である。
312 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 22:40:44 ] オライリーからHaskellの本が出るなんてありえない。 そう思っていた時期が僕にもありました
313 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 23:40:42 ] 2008/09 ちょおまw
314 名前:デフォルトの名無しさん mailto:sage [2008/07/04(金) 04:55:50 ] >>310 全30章中残りは3章。 20. The foreign function interface 27. Profiling and tuning for performance 30. A concurrent RESTful web application 書きにくそうなのが残った感じw
315 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 08:14:01 ] 初心者用のスレで関数型の話をすると罵られる。なぜだろう。
316 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:30:55 ] 初心者には関数型が高尚すぎて理解できないからです。
317 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:36:35 ] しつもんです らむだけいさんってなんですか?
318 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:38:52 ] 世界遺産の一種です
319 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:44:40 ] ttp://wwwfun.kurims.kyoto-u.ac.jp/MtLambda.html
320 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 05:32:31 ] 全部ひらがなだとぱっと見、人名かなんかかと思った。羅武田圭さんとか。
321 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:58:13 ] 俺がムラタだ
322 名前:36 ◆K0BqlCB3.k mailto:sage [2008/07/11(金) 01:58:31 ] hackage.haskell.org/trac/ghc/wiki/DataParallel/WorkPlan とっとと仕事しろやボケ
323 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 09:38:42 ] まあ遅延評価だから
324 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 10:04:21 ] 等無駄計算
325 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 16:03:12 ] >>322 なにエラソーに言ってんだよ。しょーもない評論家なくせして。
326 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:59:56 ] 名村啓?
327 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:31:18 ] do記法で 'aとか''aとか出てきますが どのような意味なのでしょうか
328 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 01:16:27 ] >>327 具体的なコード書いてみて
329 名前:デフォルトの名無しさん [2008/07/21(月) 15:09:50 ] >>327 a'とかa''じゃなくて? ちなみにそれならただの変数名だよ。
330 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 15:13:03 ] >>329 見直したらそうでした 許してくださいw ごめんなさい
331 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:32:45 ] \_ -> k この\_ってC++のtemplate <t>みたいなもんですか?
332 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:38:07 ] 全然違います
333 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:43:54 ] >>332 じゃあ何なのでしょうか?
334 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:55:35 ] ttp://www.codelogy.org/archives/2008/04/haskell_4.html ていうかなんか一冊入門書買うことをおすすめする
335 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 01:00:32 ] なんか夏まっさかりって感じ?
336 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 01:40:52 ] 質問の仕方スレもいるな Haskellでぐぐっていくつか読めばわかるぐらいのことで これって型でしょ 違います じゃあなんなんだよ つ やさしいHaskell入門
337 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 19:44:30 ] おい、おまえらの仲間が「初心者のための〜」スレで暴れてるから早く回収してくれ
338 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 20:22:33 ] 狂犬に噛まれて狂犬が増えるって 怖くね?
339 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:34:24 ] あれは仲間じゃない
340 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 02:01:40 ] そもそもスレタイからして興味ない話だし。 向こうで完結して。
341 名前:36 ◆K0BqlCB3.k mailto:sage [2008/07/27(日) 02:23:52 ] さて、この夏、何かおもしろいことでもしようかな。
342 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 10:47:30 ] お前らの中にアホがいます 他のスレを荒らすならここを荒らしますよ?
343 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:10:53 ] >>342 ほー、やってみてください。本当にできるのですか?
344 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 13:11:28 ] 夏厨誕生物語 A 「この夏、何かおもしろいことでもしようかな。」 B 「ならスレ荒らししてみれば?」 A 「簡単にできるのですか?」 B 「こうやれば邯鄲」 A 「ネ申キター!d!マジ面白いね。他スレ荒らしてクルーwktk」
345 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 05:48:39 ] 注目ワード“高階プログラミング”って何だ? ttp://ascii.jp/elem/000/000/157/157495/
346 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 06:00:24 ] >>345 面白かった。サンクス。
347 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:32:59 ] 仕事でHaskellできるなんて羨ましいなぁ。
348 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 20:30:02 ] >>345 nobsunだね。
349 名前:デフォルトの名無しさん [2008/08/06(水) 20:47:23 ] ハイカラなシャツ着てる
350 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:06:03 ] この会社ってホームページ見た感じ普通のSI会社に見えるけど、 山下さんなんかがいるってことは特殊な会社? Haskellの開発コンサルということだけど、一般企業の業務システム なんかを対象にしてるのかな。金融系とか合ってそうだけど、 普通の土方システムには豚に真珠かな。
351 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:30:36 ] >>350 看板役みたいなものだよ。 よくあること。 SRAでも青木淳みたいなのを雇っているけど、青木は普通の仕事はしていないね。 金にならないことを自由にやっているって感じ。 ちなみに、青木の部下はかわいい女の子限定。
352 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 05:56:03 ] まあ、天才ならなんでも許されるってことだ。
353 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 07:30:34 ] >>351 青木はSRAやめたよ
354 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 08:39:56 ] >>345 nobsunのコードは以前からスゲーと思ってたけど、こんな会社のこんな人なんだ。知らなかった。 会社の事業だけ見ると、Haskell関係なさそうだね。Higher Order Programmingってなんだ?造語か? もっと記事をよく見てみる。
355 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 08:55:02 ] >>354 ちょ、おまwww
356 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 09:12:13 ] Higher Order Programming: プログラミングを丸投げするためのプログラムを書くこと
357 名前:デフォルトの名無しさん [2008/08/07(木) 09:45:57 ] 継続ベースのWebフレームワークってHaskellにもありますでしょうか。
358 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 12:53:37 ] >>350 あそこって、gaucheかんけいなひとがおおそうなんだけど。
359 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 12:58:00 ] >>358 そりゃそうだ。普通のJaverやC++マが金を取ってこなきゃ、 みんなgaucheとかに走ったら誰が食い扶持を稼ぐんだって。
360 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:19:40 ] 二等兵には二等兵の仕事があるわな。
361 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:46:18 ] むしろ、パンダと飼育員。
362 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:54:11 ] 俺はまだ士官候補訓練兵だ
363 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 16:12:52 ] あの写真を見て 小野伸二を思い出したんだけど。nobsunはやっぱり天才なんですかね。
364 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 19:03:09 ] 俺は山田ルイ53世を思い出した。すまん>nobsun ルネッサ〜ンス!
365 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 19:05:14 ] あの芸人、この前番組内であからさまにいじめられてたぞ。 最近テレビの前で普通にいじめる先輩芸人が多くないか?
366 名前:デフォルトの名無しさん [2008/08/07(木) 19:55:17 ] そんなことより「Real World Haskell」の発売が10月に延びてる・・・
367 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 20:41:53 ] book.realworldhaskell.org/beta/ にある最終章、「A concurrent RESTful web application」が読みたいんだけど、 これは本買わないとダメってこと?
368 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 21:15:32 ] 最近少しずつ読み進めていたんだが そうか、本になるのか…買おうかな>RealWorldHaskell
369 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 23:21:20 ] RealWorldHaskellってHaskellの批判本なのに なんでみんな買うの? こんなにHaskellって腐ってます ゴミですって随所に書かれているのにw
370 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 23:24:06 ] 買おうかなと言ったのが一人いるだけなわけだが 脳内カウンターが回りまくりですかな
371 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:09:00 ] ん?批判本なんだ?
372 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:12:48 ] そう思っている人がいるかどうかは定かではないですが、 そう書き込んだ人間が一名いるようです。 また、買おうかなと書き込むことと買うことは別です。 プログラマたる者、このくらいの論理性は持って欲しいです。 部分と全体を混同するなんて、継承に毒されすぎです。
373 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:02:00 ] >>372 論理じゃなくて、揚げ足取りっていいませんか? 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。 0か1かじゃないんですよ。 物事は確率的なのです。
374 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:42:06 ] >>373 > 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。 著作権者や出版社勤務者が宣伝のために書いたかも知れませんよ
375 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:42:51 ] >>374 そういう可能性もある。 確率の問題。
376 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:50:39 ] >>369 ソース >>370 君が一人しか見てないだけ
377 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 03:20:20 ] >369 >Throughout this book, we're going to show you how Haskell's alternatives to the features of traditional languages are more powerful, more flexible, and safer. Haskell is positively crammed full of cutting edge ideas about how to create great software. (chap1 power) と最初のところでかいてるけど、なぜ批判本と? どこをさしていってるの?
378 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 03:22:29 ] なんとなくpractical common lispのhaskell版と言う印象なんだけどな。 オレイリーから関数型言語ぼんが出るのは初めてじゃ内科? 国内ではgauche本があるがね。
379 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 03:42:03 ] フランスではocamlの本が出てた
380 名前:デフォルトの名無しさん [2008/08/08(金) 11:58:00 ] washって継続ベースなの?
381 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:34:11 ] >>379 マジだ ttp://www.amazon.fr/dp/2841771210/ フランスでは流行ってるんだな
382 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:42:46 ] 感覚的には日本のRubyと同じ感じじゃないすかね。
383 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 16:16:02 ] >>381 いつの本の話してんだか。 この本の和訳プロジェクトはつぶれたね。
384 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 19:15:39 ] >>382 全然違う。Rubyは世界的にPythonを急追している。
385 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:55:14 ] 急追して、、いたけど結局ダメだった、というのが現在のところだよ 俺も1.9がちゃんとしたモノになるまではrubyは使うべきではないと思う。
386 名前:デフォルトの名無しさん [2008/08/08(金) 23:59:16 ] そうか? そもそも本当に10月に発売できるか分からんぞ。
387 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:21:55 ] コレすでに3回発売日伸びてる 年内出れば御の字
388 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:33:37 ] >>385 それがほんとかなぁ。とおもってgoogle trendsでruby,python,perlの検索数を比較させて みたけど、国によって微妙に違うね。 usaなら、2006ねんごろからperlが凋落しきって、python,rubyとならんで、2006中頃から、 rubyが一歩抜けて、perl,pythonが同等になっていた。 italyは、同じような時期にperlが落ちてきてるけど、pythonがかなり強くって、perlとruby が同等 japanが、perlの凋落が進んできてるけど、usaやitalyほどではなくて、一番ですね。2番め がrubyで徐々に増えてる。pythonは完全に横ばい。 chinaはpythonの伸びがかなり強い。そんなにrubyは使われてない。 indiaは日本と傾向が似てるな。 israelはrubyは絶滅ぎみ。 google全体ではrubyが一番強くなってきてるけど、これはusaでのruby人気が支えてる ような感じだな。europaとchinaではpythonが強く、それ以外の国ではperlが強いかな。
389 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 04:23:59 ] >>384 世界的にみても、わかって言語を選んでいる人よりも バズワード追ってるだけの人のほうが多いからね。
390 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 06:09:31 ] Haskellって本当にLLって言っていいのかな。 基本コンパイラだし、インタプリタも軽量とは言い堅いし。。。
391 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 06:13:31 ] LLじゃないだろw
392 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:06:03 ] > 基本コンパイラだし GHCばかり取り上げられてHugs涙目
393 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:07:11 ] >>392 そんなあなたをはぐはぐ。w あーっ!ではないよ。
394 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:22:00 ] 初心者なんですが、Haskellが型については静的であることを選択した 理由って何かあるんでしょうか。純粋であることや遅延評価が、静的 型やコンパイル時の最適化を要請するということなんでしょうか?
395 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:27:55 ] GHCはHaskell解釈系ランキング第一位! 「やっぱりGHCだね」
396 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:06:49 ] >>394 静的なのは、最適化も大きいだろうけど、 むしろ安全性を狙ってるという要素が大きいんだろう。 遅延評価なのはコンパイル時の最適化にプラスなのかなぁ? これは理論的に停止できる関数は必ず停止できるっていう、 これまたある種の安全性?が主な目的だと思うけど ( if true (answer foo) (nonStop baa) ) みたいな文を考えよう(Haskellの文法忘れたから適当)。
397 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:14:15 ] 別に"動的型付け-純粋-非正格-インタプリタ型"の関数型言語もあり得るよな 効率はどうなんだろう、"動的型付け-正格"の言語よりさらに遅いことは想像が付くが
398 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:28:23 ] >>394 Goferがそうだったから。 で、なんでGoferがそうだったのかというと、Mirandaがそうだったから。
399 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:37:45 ] >>396 遅延評価は最適化にマイナスだよ。少なくともメモリ空間の最適化には全く向かない。
400 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:44:26 ] 遅延評価なんて 今日はやらない
401 名前:396 mailto:sage [2008/08/09(土) 10:50:37 ] >>399 そうだよね。 コンパイル技術がすげー発達して高速になれば、話は変わるだろうけど。 (まぁ、コンパイル技術が「すげー発達」すれば、どのコンパイル言語でもマシン語と同じスピードが出るんだから、意味ない話) あと「理論的に停止できる関数は必ず停止できる」は意味不明だとか、 文じゃなくて式だとか、気づいたけど後の祭り、いわゆるアポステオリorz
402 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:02:51 ] >>395 Guarded Horn Clauses
403 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:31:02 ] 手続き型言語は、ノイマン型計算機を抽象化することで生まれてきたので、 評価方式としては、式、文の逐次的解釈が当然になる。 関数型言語は、ラムダ式から出て来たから、 その評価形式をどうするかというのが一つのポイントになる。 遅延評価は最左最外簡約の研究から出て来た。 効率がどうのこうのというより、 新しいプログラミングパラダイムを産み出したので、 (例えば無限リスト、無限木の積極的利用) 研究され続けているんだと思う。
404 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:32:55 ] >>402 GLOBAL HONORED CROWN www.noah.co.jp/ghc.php
405 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:37:31 ] 関数型とか意味がない言語だと思うけどねぇ 何ができるってわけでもないし HaskellでWindowsは作れないしLinuxも作れない Webサーバも作れないしDBも作れない 意味がない
406 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 11:44:54 ] >>405 www.thenewsh.com/~hws/
407 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 11:45:52 ] ごめん、今からインディージョーンズ見に行くから急いでるから!
408 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:47:37 ] まあ普通はモデルを現実に合わせるよな。 代入だらけのプログラムをSSAとかいう形式に変換するとか。
409 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:48:09 ] >>394 純粋関数型言語・遅延評価で、 型なし・インタプリタ言語ってあるよ。 変態言語 Lazy K がそれ。 ある意味では Make とかもそうかも。 少なくとも、 純粋関数型言語・遅延評価と、 コンパイル言語かインタプリタ言語か っていうのはあまり関係ない。 純粋関数型言語・遅延評価は、 シンプルな手続き型よりもインタプリタを書くのが難しい、 っていうのはあるかもしれないけど。 純粋関数型言語であることと静的型であることは、少し関係があるかも。 純粋関数型言語でかつ動的型というのは、概念的にあまり良い食い合わせではないとは思う。 動的型っていうのは、関数の世界では「型無し」ってことになると思うんだけど、 いずれにせよアドホックなエラー処理が必要になって、 純粋関数型的にアドホックなエラー処理というのは少なくとも美しくない。
410 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 12:17:29 ] >>409 遅延評価でインタプリタ。破壊的関数が作れないというものなら、R言語くらいしか知らない。
411 名前:394 mailto:sage [2008/08/09(土) 12:56:14 ] 皆さんレスありがとうございます。 論理的に組み合わせ悪いというよりは、静的型のメリットを選んだ ということなんでしょうか。 静的型VS動的型というのは、安全VS自由ということだと思うんですが、 Haskellは安全を選んだということなのかな。純粋関数型としては、 副作用に関連する不具合から自由なのが売りだと思うので、更に 静的型によって徹底的に信頼性を上げてるという感じなんでしょうか。 >>409 純粋関数型であること(参照透明であること)と動的型が食い合わせ 悪いというのがちょっと分かりませんでした。動的型は実行時不具合 の問題が付きものと思うのですが、参照透明との関係をよろしければ 少し詳しく教えていただけマスでしょうか。
412 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:08:18 ] そもそも関数型言語に意味が無い
413 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:13:08 ] >>411 動的型を使うと、アドホックなエラー処理が必要になるよね? っていうか、それがないと動的型を使ううまみがないと思うんだけど。 ここでいうアドホックなエラー処理っていうのは、 対象オブジェクトの型をプログラムで認識して、 意図しないオブジェクトが来たときにエラー処理するってことだけど。 このエラー処理にIOを使わないなら、 それは多相型やクラスを使っても同じ結果が得られるよね。 だから、Haskellに動的型を組み込む必要性は、 意図しないオブジェクトが来たときIOを使ったエラー処理をしたいときに限られると思う。 で、純粋関数型言語は参照透明性ゆえにIO処理するの苦手。 まぁ、動的型っていうのはプログラム中で型を認識できないと意味ないよね? っていう時点で、カリー・ハワード対応との関係で微妙っていう気にするけど。 僕が考えているのは、そんな感じ。
414 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:17:44 ] 上っ面を語り合って自己満足か Haskellに多いやつらの典型だなw
415 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:18:59 ] グリーンスパンの第10法則が発動すると、どんな言語で書こうと 動的でマルチパラダイムな言語で書いたのと同じになる。
416 名前:394 mailto:sage [2008/08/09(土) 13:33:07 ] >>413 なるほど、理解しました。ありがとうございます。
417 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:50:48 ] >>405 せいぜい生きる力を養ってください
418 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:54:52 ] >>416 implementationの本を読むといいよ Peyton Jonesのがpdfで読めるはず
419 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:11:34 ] >>418 俺はPJのが好きだな。 静的型付けとグラフ簡約が運命的な出会いであることがわかった。
420 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:19:55 ] >>413 なんか議論が無茶苦茶じゃないか? 例えば「型エラー」を「0除算エラー」に置き換えても論理展開が変わらん >このエラー処理にIOを使わないなら、 >それは多相型やクラスを使っても同じ結果が得られるよね。 動的型の重要な利点は、型をいちいち書かなくてもいいという利便性だよな 多相型やクラスを使って動的型をシミュレートするのはすごく面倒だから、この利点を享受できない それから、GHCではerrorやundefinedで発生したエラーをIOモナド上で捕捉できる。念のため
421 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:26:59 ] だな。Haskellの例外処理で不足があることはそうそうないと思う。 あと、動的型のメリットを例外処理だけに限定するのは視野が狭すぎる。 LISPのメリットはアドホックな例外処理か?そうじゃないと思う。
422 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:39:32 ] >>420-421 納得できないのなら、それで良いです。 僕も、べつにそんなに優れた論拠だと思ってないから。
423 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:55:35 ] 俺も>>413 はひどい文章で内容もないと思う。 >>416 が理解したのが驚愕。
424 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:20:10 ] 本当だ、マジで何言ってるのかわからん すげえ
425 名前:394 mailto:sage [2008/08/09(土) 15:22:47 ] 動的型のメリットは型を単に書かなくて済むことだとは思えないんですが。 それだけであれば、コンパイルで発見する不具合をテスト時に見つけよう とする、つまり面倒なことを後回しにしてるだけ、ってことになりませんか?
426 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:23:15 ] 別に動けばいい
427 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:30:45 ] 何でも指せるポインタってのはメチャ便利なんですよ。 S式なんて最たるもので、静的な型付けは不能あるいはワイルドカード的。 静的か動的かはトレードオフの問題。
428 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:42:04 ] >>425 不具合を見つけるタイミングが遅くなるという対価を払って、記述の利便性および変更の容易さという報酬を得る ちゃんと取引として成立してるじゃないか もちろん「型を書かなくて済む」こと以外にも利点はある 特定の静的型付け言語ではそもそも型を付けられないようなコードが許容されるとか
429 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:38:51 ] >>425 lispを使ってる限りの印象だが 都合のよい所だけ型宣言が出来るというのは柔軟性につながるかな。 プログラムの最適の仕方も静的/動的で違いがあると思うよ。 型なんで考えずにアルゴリズムだけ作っちゃえができるからね。 それでも型を意識したプログラミングをすることはあるが。 でも、haskellでもポリモつかえばある程度型無視ラピッドプログラミング は可能じゃないか?
430 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:41:42 ] じゃあOCamlでいいじゃん
431 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:44:14 ] >>430 haskellって参照透明性ってかなりのメリットだと思ってるけど。
432 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:49:41 ] 注意してかけばいいだけの話 Hashkellはメリットを殺すデメリットしかないだろ
433 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:56:37 ] 正直、exists型が標準になれば動的型付けは不要じゃね? en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
434 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:57:26 ] >>430 OCamlはstrictだから。残念。
435 名前:394 mailto:sage [2008/08/09(土) 19:55:26 ] >>428 コンパイル時に問題が抽出されることと、テストによって抽出されるのでは 質的な違いがあるんじゃないですか?テストは結局は人間がやるものだし、 不具合の可能性を低めるということにしかならないけど、コンパイルでの 不具合検査は対象となるプログラムの論理的正しさを証明していることに なるかと思います。 容易に変更ができたとして、不具合がどこに潜んでいるのか分かりにくい というのは非常に問題あると思いますよ。コンパイルで分かるのならば、 これは明白でしかも機械的に全てが晒されますから安心です。
436 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:20:59 ] Rubyは危険だしセキュリティリスクしか そんざいしないしな
437 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:23:09 ] >>435 確かに、バグがどの段階で発見されるかには質的な違いがある でも、静的な型検査だって全てのバグを検出できる訳じゃないから、 結局、動的検査との安全性の違いは程度問題 その上で、静的な型検査の利点がコストを上回るという判断は当然ありえるし、 そう判断したなら静的型言語を使えばいい
438 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:28:12 ] >>435 静的型チェック馬鹿ですやん
439 名前:394 mailto:sage [2008/08/09(土) 20:39:50 ] >>437 例えば、参照透明ということについてはどうでしょうか?こちらも、副作用を許容 すれば、プログラム中に登場する変数の中身が何に変異しているかどうかが 分からなくなり、実行してみないと問題が検出できない、ということになります。 参照透明を強要するのも、型を強要するのも、結局その辺がクリアできない プログラマというのはそれらに関連する不具合を出してしまうんだと思いますが どうでしょうか。気をつければいい、というのは簡単で規模が小さなシステムでは 言えることで、そうでなければ膨大なテスト工程が必要になってしまうのでは?
440 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:46:48 ] OCamlが参照透明じゃないから嫌ってどういう事を言ってるの? refとかで破壊的な変数が作れるから嫌とかそういうレベルの話じゃないよね。 それだったらref使わなければいいだけだから。 逆に、Haskellの参照透明で良い所ってどのへんなの? OCamlのでも、ErlangのでもなくHaskellの参照透明性が良い理由を説明してほしいんだが。
441 名前:394 mailto:sage [2008/08/09(土) 21:04:32 ] >>440 参照透明でない、ということは値が望んだ通りの値であることを 保証するためにどこまでも神経質にテストをしなければならない、 ってことですよね。 一人で開発するのであればいいですが、多くの人の手によって 間違いがあってはならないシステムの開発をする際、「それは 禁じ手だから止めてね」と口約束するだけってのは非常に怖い わけです。だからこそ、テストの工程が膨れ上がる。 Haskellに自分が惹かれている大きな理由の一つは、この辺の 頑固さを貫いていることですね。
442 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:19:02 ] 参照の透明性があれば、 それだけでテストが必要なくなるわけでも、 テストが簡単になるわけでもない。 そうなるのはトイプログラムだけ。 嘘だと思うなら、GHC, Hugsなどのバグトラックをみてみればいい。
443 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:21:51 ] テストが減ることを数学的に証明してみせれ。
444 名前:437 mailto:sage [2008/08/09(土) 21:22:55 ] >>439 何が言いたいのか良く分からん 俺は「気をつければいい」なんて一言も言ってないよ >>428 に書いたように、動的か静的かの間でトレードオフが成立すると言っているだけ >>441 OCamlの変数は変更不可だよ 変更できるのは参照(ref)で、これは変数とは別物 だから、口約束するまでもなく変数の値が変わらないことは保証されてる
445 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:26:07 ] >>440 参照透明性を壊さないと入出力できないのが嫌
446 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 21:37:36 ] >>443 数学的に無理だから、統計的に証明するわけですよ。 実際に〜〜でした、ってね。 ヒューマンインターフェース系の論文が参考になるんじゃないかな。 あっちは全部そんな感じ。
447 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:38:56 ] >>441 Haskellでもやろうと思えばIORefとかで事実上破壊的な操作が可能になるわけですが、 これについてはどうお考えで? 「HaskellでIORefは使うな」っていうプログラミングルールを設定することは 「OCamlでref使うな」っていうルールを設定することと本質的に違わないと思うんだけど それについてはどうなんすか。
448 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 21:40:14 ] インディージョーンズ、あれは予算が無いからあんなにちゃっちい水晶髑髏なのか? どう見てもアクリル製のガワの中に反射板入れただけやん。 UFOとかエイリアンとか、考古学じゃなくてSFやん。 突っ込みどころ満載な映画でした。 かしこ
449 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:13:11 ] monadとラムダの簡単な練習いっぱい したいです。どこがいい問題集頂戴
450 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:23:39 ] >>449 do記法を使わずにliftM、liftM2、joinを実装 Continuationモナドを実装
451 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 23:30:03 ] >>450 また何も考えずにそういうこと言う。 >>449 ja.doukaku.org/
452 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 23:31:04 ] 英語が読めるなら projecteuler.net/
453 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:05:51 ] >>451 モナドとλの練習なら>>450 はいい案じゃないか。 いっぱいじゃないけど質的にいい。
454 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:08:55 ] そんなことが書きたいんじゃなかった。 >>419 PJのって何?本もpdfもPJのでしょ?
455 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:02:29 ] PJは Implementation of Functional Programming Implementing Functional Languages,(D. Lesterと共著) を書いていて両方公開。 www.haskell.org/haskellwiki/Books
456 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:05:37 ] >>449 www.haskell.org/haskellwiki/Tutorials
457 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:23:16 ] >>454 すまん、>>455 のImplementing...のほうを言いたかった。
458 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/10(日) 13:39:12 ] >>453 >>449 は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。 それに、初心者は何か目に見えて動かせるものを書きたがるものさ。 誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、 やっぱり前者の方がいろいろ調べたりすることで勉強になる。
459 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:23:20 ] >>455 そこ載ってなくね?w research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm research.microsoft.com/~simonpj/Papers/pj-lester-book/ >>457 サンクス。目次しか見てないけど、 Implementationがパターンマッチや型など広く扱ってて、 Implementingはコンパイラのコアな部分を主に扱ってる感じ? 静的型付けとグラフ簡約の運命的な出会いというからそうでもない? まあImplementingのほうを読んでみます。 >>458 そうですね。
460 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 16:23:15 ] 載ってるよー グラフ簡約と運命的な出会いというと遅延評価じゃないかね。 特にPJ的には。
461 名前:419 mailto:sage [2008/08/11(月) 14:41:51 ] >>460 まあグラフ簡約は前提として、それを効率的に実装するには静的型付けがイイんだよ、 と、約20年前に読んだ時に思った。
462 名前:419 mailto:sage [2008/08/11(月) 14:44:37 ] 20年前じゃなくて15年前だった。かなり記憶が混乱してるな、俺 orz
463 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:05:22 ] >>461 あまり理解できてなかったんじゃない?w
464 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:13:31 ] >>463 かもしれない。 できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。
465 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:20:35 ] PJの最初の本だと、 例え動的型チェックをやろうとも、そのコードは、 他の普通のコードと一緒でスーパー・コンビネータになって、 グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、 スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。
466 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:39:55 ] 横から口はさんですまんが、静的型がついていたほうがパターンマッチが速くならね?
467 名前:デフォルトの名無しさん [2008/08/13(水) 09:02:33 ] Haskellの継続ってSchemeとは違いありますか?
468 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:48:15 ] call/cc のようなものはありません
469 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:17:46 ] >>468 MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。 >>467 俺も気になる。違いはあるだろうけど、どう違うのか。
470 名前:デフォルトの名無しさん [2008/08/13(水) 11:23:16 ] やっぱりそうですか。継続ベースのアプリ 作るとしたら、ステートモナドに次のアクション 入れておくとかですかね。
471 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 13:45:50 ] MonadContだと、型の関係で、無限ループするような式は書けない。 # mfixとか使えば別だけど。 例えば、Schemeで次の式は書けるが、MonadContでは書けない。 (call/cc (lambda (c) c)) (call/cc (lambda (c) (set! foo c))) つまり、次の式は型が付かない。 callCC (\c -> return c) callCC (\c -> lift $ put c) 要は、callCCで捉えた継続をそのcallCCの外に出せない。ただし、 callCC (\c -> ... callCC (\c' -> c c') ...) のように、内部で別のcallCCを使って、それで捉えた継続を外に出すのはOK。 あと、変な例として、 callCC (\c -> return (Right (c . Left))) はOK。でもやっぱり無限ループはできない。
472 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 14:58:55 ] >>471 だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?
473 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 17:43:19 ] smlのcall/ccを使ったco-routineは知らないけど、co-routine自体はできる。 import Control.Monad.Cont foo = callCC (\c0 -> do c1 <- callCC c0 c2 <- callCC c1 c2 10 undefined) bar = (do c1 <- foo c2 <- callCC c1 callCC c2) main = print $ runCont bar id
474 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 18:18:41 ] >>471 HaskellでYコンビネータを書くとき型が問題になるけど、 実質的には fix f = let g = f g in g で問題ない。 それと同じように、 loop = callCC (\c -> let g = c g in return g) とすれば do { l <- loop; liftIO $ print 0; l } のように無限ループを書ける。 (これの変数付きループ版が MonadLib にあった。) (call/cc (lambda (c) c)) がどう使われるのかよく分からないけど、 実質的には同じことになるんじゃないかな? (call/cc (lambda (c) (set! foo c))) callCC (\c -> lift $ put c) は IORef を使うと問題なくできる。 State だと無理だけど、新しく再帰的なデータ型を定義してやれば、 あまり便利では無さそうだけど一応できた。
475 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:46:51 ] オラ本の執筆遅れてます 著者にプレッシャヨロ
476 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/13(水) 22:51:05 ] どうせ買わないので暖かい目で見守るだけです。
477 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:21:14 ] Schemeのcall/ccってその時点の継続を勝手にキャプチャして渡してくれる んですよね?Haskellではそういうのは無いと思っていいんでしょうか?
478 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:04:58 ] >>477 モナド無しでということなら無い。 そもそもcall/ccは副作用があるし。
479 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:47:21 ] >>474 ができると言ってるじゃないか
480 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:35:34 ] あれはモナド有りでの話だよ。
481 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:53:40 ] ごめん、>>479 は>>477 へのレスね
482 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:54:49 ] 山本モナド
483 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:35:13 ] Haskellはボブマリーの言語? lethain.com/entry/2008/aug/14/global-popularity-of-programming-languages/
484 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:24:00 ] コメント欄も読もうな
485 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 22:50:09 ] ttp://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=123319698 こうゆう落ちもある。
486 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:30:17 ] Xmonad/Config archive - HaskellWiki haskell.org/haskellwiki/Xmonad/Config_archive の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが どこから勉強すればいいんでしょう? 知識はXmonadやGhcをソースからインストールできる程度です
487 名前:デフォルトの名無しさん [2008/08/17(日) 13:44:52 ] >>443 >>446 静的で強い型を持つ言語は、単純な実行時エラーを防ぐので テストは軽減する。haskellなどはそのことが数学的に証明されているので プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、 本質だけを考えることができる。
488 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:23:37 ] パターンマッチに失敗すること多くない? たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?
489 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:47:05 ] ぬるぽは無いけどout_of_bounds発生させまくりですが 依存型のある言語なら防げるかも知れんけど
490 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 15:31:08 ] >>487 おまえ初心者スレにいたHaskell信者だろ。
491 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:08:12 ] はいはい両者リングアウト
492 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:14:59 ] >>488 それヘボすぎ
493 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:26:58 ] モナドがIOに使えるのは分かった。けどどうしてそれをIO以外にも使ってるの? >Haskell 誰か教えて下さい
494 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:20 ] Maybe(笑)を証明するため
495 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:41 ] 便利だから
496 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:42:38 ] どんな時に便利ですか?
497 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:59:33 ] モナドのすべて ttp://www.sampou.org/haskell/a-a-monads/html/ の以下の部分を読むとわかるかも Maybe というモナド ひとつの例 リストもモナド
498 名前:497 mailto:sage [2008/08/17(日) 19:11:05 ] 第 II 部:標準的モナドのカタログ の各モナドの利用場面や動機を見るのもいいかもしれない
499 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:15:59 ] 一応リストモナドやMaybeモナドが計算に使える、というのは理解しているつもりですが、 便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか? それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる 慣れの問題かそれとも理解不足か・・
500 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:25:15 ] >>489 そこでmaybeもなどですよ。
501 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:06:22 ] モナドという抽象的な枠組みを考えることで IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。 単に使うだけなら主に慣れの問題だと思う。 いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。
502 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:09:49 ] 自分の作ったモナド上でdo式を書くと、世界の法則を書き換えてるような気分になってちょっと面白い
503 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:33:06 ] >>501 レス有難うです 慣れの他に密度の問題もあるかもしれないと思ったり。 他の言語より1行あたりの密度が濃いものになりやすい気がする。 というか濃縮されすぎてわけが分からなくなりやすい気がする。
504 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:38:12 ] >>501 計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね? モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う と思うんですが。
505 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/17(日) 20:39:51 ] モナドっていうと仰々しいイメージがあるかもしれないけど、 所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。 ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
506 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:40:10 ] Stateモナドとかの(s -> (a,s))みたいな変な定義が気持ち悪い 型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……
507 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:08:43 ] >>505 それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと 毛色が違うという認識は勘違いでしょうか?
508 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:17:01 ] www.hyuki.com/haskell/20041228215300 Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」 Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」
509 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:31:22 ] それ単にOrdとかの『類』は*で引数をとらないけど Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない 分けて考えるのはおかしいと思う
510 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:37:45 ] >>509 型クラスと型構成子クラスじゃ抽象度が違うよ。
511 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:49:13 ] 俺も>>509 みたいに感じるなあ 抽象度が違うのは理解できるが
512 名前:507 mailto:sage [2008/08/17(日) 21:58:16 ] 抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの 遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。 普通の計算を行う裏側で別の次元での計算が行われ、且つそれが 結合法則を満たしている、というのがモナドの定義と考えるのは どうですか?自分は圏論などのこと全く無知なのでHaskellの構文 からの直感的な印象だけなんですけど。
513 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:59:06 ] じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。 有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
514 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:31:24 ] >>512 だいたいあってんじゃね? 見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、 普通のプログラミング言語じゃfor文やif文みたいな処理構造、 あるいはマクロとして提供されるものと同等の処理ができるんだけど、 実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。 たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。 結合法則を満たしているってのは、まぁ別に特別なことじゃない。 EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、 よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
515 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:45:32 ] 念のため補足。 >処理構造(略)同等の処理ができるんだけど 普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。 >よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない 浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。 個人的にはMonad則は、 値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
516 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:50:03 ] 変な実装=全順序じゃない、と読み替えてくれ。 コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
517 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:19:23 ] ごめん、誤解を招くといやなのでもう一つ補足…… >値に関して順次実行できる何か これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。 g.f x がxにfを適用してgを適用するってのと同じことだよ。 実行順序は普通のモナドもIOモナドも方向は決まってないよ。
518 名前:初心者修業中 mailto:sage [2008/08/17(日) 23:37:55 ] ん? 実行順序を明確にするのがIOモナドの目的の一つ と認識していますが。 そういう意味ではないのかな…
519 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:41:24 ] Haskellをみて日本のhaskellコミュって元気なの? 他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。 なんでだろ?
520 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:58:38 ] >>518 たとえば、 1:2:3:[]は、 1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。 でも結果は一緒でしょ? 同じように、 Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力 みたいなのは、まぁ言ってみれば(不正確だけど) [Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。 この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。 実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。 getContentとかは実はこれを使って実装されている。 Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)
521 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 00:02:55 ] Maybeの特化にしか見えません
522 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/18(月) 00:25:49 ] >>519 世界的に全く元気がありません。 ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
523 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 01:36:55 ] >>520 後者の簡約は型がおかしいし、1:2:3:[]ではなく、 f x = (unsafePerformIO $ print x) `seq` xで f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。 前者は3,2,1で後者は1,2,3 一方で(>>=)は最左最外簡約でも最右最内簡約でも 左から順にしか値が定まらないようになってる。 putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c) (>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。
524 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 03:17:18 ] >>522 元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
525 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 04:14:24 ] ruby
526 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 08:38:27 ] >>520 > 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。 型が滅茶苦茶だよ。 > この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。 意味不明。なぜプログラム終了後にコンパイラが出てくる。 ランタイムライブラリとごちゃまぜになているぞ。
527 名前:デフォルトの名無しさん [2008/08/18(月) 10:05:00 ] Haskellにこういう奴が多い気がするのはなぜだ
528 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 10:21:37 ] 「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、 想像力の貧しい奴がこのスレに多いような気がする
529 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 13:36:03 ] 末尾が「気がする」で終わってるレスは 全部気のせいのような気がする
530 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:08:49 ] なんという自己言及レス
531 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:12:16 ] 関数型らしくて言いじゃないか
532 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:41:06 ] >>531 つ座布団1枚
533 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:50:15 ] * -> * -> * ってどんなとき使うの?
534 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:25:25 ] アナルトレイン
535 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:45:46 ] ( ゚д゚)゚д゚)゚д゚) / つ つ つ (_(_ ノ ノ ノ し∪ ∪ ∪
536 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 10:10:53 ] >>505 > ところで、 データ型とAPIのセット のことをなんて呼べばいいの? プログラミング言語一般での話なら「抽象データ型」でしょうね。
537 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:50:46 ] >>533 関数(->)とかタプル(,)とか
538 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 20:24:46 ] 485でおま。 それでなのです。 >ときどきの雑記帖の中の人
539 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 14:40:13 ] Arrow は * -> * -> * のクラス MonadTrans は (* -> *) -> * -> * のクラス
540 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:20:37 ] book.realworldhaskell.org/beta/ これの30章が消えてるんだけど・・・。
541 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:05:29 ] 本買えよ
542 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 23:26:23 ] 30章だけが読みたいんだよ。 ところで、HaskellでPetStoreってあるの?
543 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/21(木) 23:56:58 ] >>542 横からすみませんが、 Pet Storeをよく知らないのでちょこっと検索したんですが、 これっていったい何が面白いんですか?
544 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 00:08:29 ] >>543 面白くは無いんだけど、色んな言語やフレームワークで同じもの作る ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ ちゃうぞ、という。
545 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 11:40:45 ] Haskellでウェブアプリというとふつう本か
546 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 12:37:40 ] 最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、 ライトウェイト言語がブームみたいだね。 HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、 RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが 出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
547 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:19 ] >>546 WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。 Javaの功罪は大きい。
548 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:59 ] まだ横ばいならたいしたもんだ
549 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:48:26 ] >HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、 ライトウェイトって何?動的に型を付ければライトウェイト? それとwebとどういう関係があるの?
550 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:05:36 ] あまり考えずに気の向くままに書いてもあっさり動くのが ライトウェイトってことじゃないか? web案件は短期だったりアジャイルだったりでライトウェイトに 開発できるのが求められてるってのはある
551 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:10:45 ] WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。 だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
552 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:11:10 ] ここでHaskellは人間の思考過程に最も近いから 考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場 ↓
553 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:23:23 ] | ( ゚д゚ )↓ (⊃⌒*⌒⊂) /__ノ''''ヽ__)
554 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:27:58 ] >>550 それならHaskellもライトウェイトで良くね?
555 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:05:36 ] 明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。
556 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:18:04 ] LLとかWebアプリとか、 だから普及しないとか、 どうでもよくねえ? 好きな事、楽しい事すればいい。
557 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:22:47 ] >>555 runghcがあるじゃないか もうちょっと速ければと思うことはあるけど
558 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:34:05 ] >>556 そういう立場も理解できるけど、俺は普及してほしい ライブラリのメンテとか人が足りてないじゃん
559 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:46:33 ] >>552 Prologには負けるんじゃない。
560 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 14:47:15 ] runghcはオーバーヘッドもかなり大きいみたいだね。 $ cat hello.hs main = putStrLn "hello" $ time runghc6 hello.hs hello real 0m0.835s user 0m0.780s sys 0m0.052s $ cat hello.rb print "hello\n" $ time ruby hello.rb hello real 0m0.015s user 0m0.012s sys 0m0.000s
561 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 14:48:14 ] $ cat hello.pl print "hello\n" $ time perl hello.pl hello real 0m0.007s user 0m0.004s sys 0m0.000s $ cat hello.py print "hello" $ time python hello.py hello real 0m0.035s user 0m0.020s sys 0m0.016s
562 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:03:43 ] LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?
563 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:07:56 ] WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、 Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。 そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。 まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。 ここでmondic Parser Combinatorを持つHaskellが 最もテキスト処理に適した言語であると主張する人がどこからか登場。 ↓
564 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:38:43 ] HaskellもLL言語だよ
565 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:45:06 ] これどうなの? ttp://happs.org/
566 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 16:09:31 ] Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。 満足した?
567 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 17:42:48 ] haskellは型推論がちゃんと効いてる使い方が出来れば、LL的な生産性は確保できるだろう。 だがな、至高の存在で良いじゃないか。 haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる 分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に 苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに なってるんでしょうね。 だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を 大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?
568 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 18:09:07 ] >>567 もし金融などで使われることを想定するなら、 haskellの並列処理に関する部分も早く実装してほしいところですね。 (まだ未完成)
569 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:44:00 ] 某氏のhapps解説はお流れ? >>567 > 破壊的操作がほとんどできない なんで?
570 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:58:34 ] なんでそんなにHaskellの応用分野を限定したがるんだw >>567 コンパイルするならmod_haskellがあっても恩恵は小さいだろ >破壊的操作がほとんどできないし Haskellで入出力書いたことあるか? >ファイル操作は基本的に苦手 これも良く分からん flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?
571 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:43:28 ] ウイルス対策ソフトのように危機感を煽るのはいいが、 既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね
572 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:54:17 ] >>570 Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが 発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。 もちろん数百万レコードを越える処理単位の話だが。 Haskellの場合この問題は起きないの?
573 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:37:03 ] Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと 使う人は頭打ちだと俺も思う。 研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。
574 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:53:32 ] >>572 アトムの爆発ってのはPrologスレで言及されてる現象のことでいい? そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん Lispのシンボルみたいな物と思っていいのかな それなら相当するものはHaskellにはないよ
575 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 21:35:41 ] >>574 Lispのシンボルみたいな物、ですね。 記号をどう処理しているのですか。
576 名前:デフォルトの名無しさん [2008/08/22(金) 21:53:05 ] >>540 30章ってなんの章だったの?
577 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:12:26 ] >>575 「記号」と言われてもいまいちピンと来ないんだが、何にせよ、 普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う 取り得る種類がコンパイル時に決まっているなら列挙型 そうでないなら整数とか文字列 文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか
578 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:34:03 ] >>576 >>310-314
579 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 09:45:26 ] >>572 Prologでも、 1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの 処理をしたりすると確かにアトムが大量発生するだろうが、 Stringとして読み込んで、終始String処理に徹すれば、アルファベットの 数、つまり高々数万のアトムで済むんじゃないの? Stringすなわちリスト処理になると遅いから嫌なのかな。
580 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:00:27 ] 宣言的言語をリアルタイム処理に使いたくない病にかかってる。 資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。
581 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:09:14 ] >>579 処理速度もあるかも知れませんが、アトムだと、 foo([株式会社|R],R). と書けるところが、Stringだと foo(List,R) :- append("株式会社",R,List). と書かなくてはならないということがあります。 appendを高速化する機構が欲しくなりますね。
582 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:35:10 ] それって代数的データ型を使ってこんな感じで良いんじゃない? data Atom = Kabushiki | Dummy deriving (Show, Eq) foo :: [Atom] -> [Atom] foo (Kabushiki : r) = r
583 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 11:43:27 ] Prologでまったり Part3 pc11.2ch.net/test/read.cgi/tech/1193354806/
584 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 12:43:04 ] >>581 この話おかしいよ。 foo([株式会社|R],R). の方は、 すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。 一方、 foo(List,R) :- append("株式会社",R,List). のListはString。ここは、 foo(["株式会社"|R],R). でなきゃ、フェアじゃない。
585 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 13:58:45 ] >>572 > Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し 第五世代コンピュータプロジェクトの成果を是非参照下さい。
586 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:16:16 ] >>585 よく知らないけどソフトウェア科学会会誌7月号に第五の話題が載っていたよ
587 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:21:10 ] 成果って、「prologって役立たずじゃん」という結論を得たこと?
588 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:28:53 ] >>587 それは短絡的な人たちの根拠のないうわさ。 第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。
589 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:31:33 ] Prologの話は他でやってくれ んで問題点を整理してまたいらっしゃい
590 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:33:31 ] 詳しいことは忘れたけど、 述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。 なんだったっけ?
591 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:45:22 ] Prologはどうでもいいのだが、Haskellで金融(とくに保険業)のアブリを 開発する場合、何か問題になる点はないのか。
592 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:54:20 ] >>591 必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。
593 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:57:02 ] 金融系システムにHaskellを使うメリット自体が思いうかばん。 いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。 どうせ枯れたシステムなんだから。
594 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:00:18 ] >>592 full lazyな処理系って、よくわからない。
595 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:11:43 ] どんな言語で書いたとしても、必要なメモリの量は実際に動かしてみないとわからないよ。
596 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:17:46 ] haskellっていいプロファイラあんの?
597 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:26:42 ] >>595 COBOLなんかは確定してると思うけど。
598 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:42:16 ] >>597 してない。 SORTなどに内部的に使う記憶容量が不明。
599 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:43:11 ] Haskellのようにデフォルトで遅延評価する言語は、 計算をできるかぎり遅延させようとするから、 下手な書き方するとすぐメモリリークする Haskellのメモリリークは大抵の場合小規模な修正で直るけど、 どこを修正すべきか探すのに慣れとプロファイラが要る >>596 GHC付属のプロファイラは優秀だと思う
600 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:47:59 ] >>596 profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。 詳しくはマニュアルで。
601 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:19:23 ] >>598 ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。 グラフ簡約のヒープ消費は予測もつかんぞ。
602 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:27:11 ] >>601 確定してるのかしてないのかどっちだw
603 名前:初心者修業中 mailto:sage [2008/08/23(土) 16:37:52 ] Haskellでメモリーリークが起きるのですか? ガベージコレクションにバグがない限り、 メモリーリークが起きるとは思えないのですが…。 FFIを使った場合の事でしょうか…。
604 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 17:15:44 ] >>599 の例としては↓の話かな。 d.hatena.ne.jp/desumasu/20060909/1157800884 この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、 期待した解放タイミングと実際のそれとのギャップの事みたいだね。
605 名前:初心者修業中 mailto:sage [2008/08/23(土) 17:42:49 ] これも「メモリーリーク」と呼ぶのでしょうか? *Main> foldr (+) 0 [0..1000000] *** Exception: stack overflow
606 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:05:58 ] プログラマが意図してないで、リファレンスが残るようなコーディングを しちゃってる、というのをリークに含めることもある。
607 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:34:57 ] >>605 それは「マヌケ」と呼びます。
608 名前:初心者修業中 mailto:sage [2008/08/23(土) 18:57:56 ] stack overflowが発生する時、 簡単にわかる場合は「マヌケ」 ちょっとわかりづらい場合は「メモリーリーク」 と呼ぶという認識でよろしいでしょうか?
609 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:14:20 ] リークってのは「漏れ」のこと。 GCのある言語だと、>>606 しか起こり得ない。 >>605 の「溢れ」とは全然違う。
610 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:20:46 ] >>605 それはスタックオーバフロの例外であって、エラーとは違う。 メモリリークしているわけではないよ。
611 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:22:12 ] C言語みたいに型があいまいな言語ではメモリリークが起こりうるが、 Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー
612 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:26:56 ] スタックオーバーフローとメモリーリークは 現象として全然違うと言う事ですね。 分かります。
613 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:53:14 ] >599や>604が挙げているような例はC言語で 良く言われる「メモリーリーク」とは違う現象だな。 Haskellの場合、遅延評価がデフォーなので うかつに再帰を使うと計算の途中結果が膨大な ものになってヒープ領域が溢れてしまう。 Cの場合はただの確保したメモリの解放し忘れ。 Cでも再帰的なメモリー確保をすれば Haskellみたいな事も起きうるはずだが。
614 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:06:48 ] >>611 強い静的型付けとメモリーリークの有無はほとんど関係がありません。 GCの方がずっと関係が深いです。
615 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:09:24 ] Pascalのnewとfreeだっけ? あれ考えれば分かるよな。 強い型付けでも簡単にメモリーリークは起きる。
616 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:56:45 ] foldl でも stack overflow するんだよね。 Data.List.foldl' 使えばいいんだけど。
617 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:35:43 ] なんで foldl でスタック溢れるの?末尾再帰が最適化されてないの?
618 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:48:31 ] >>604 のリンク先に書いてある 末尾再帰は最適化されるよ
619 名前:初心者修業中 mailto:sage [2008/08/23(土) 23:53:01 ] >>617 遅延評価だからと認識しています。 ↓参考 haskell.g.hatena.ne.jp/jmk/20060710/1152516465
620 名前:617 mailto:sage [2008/08/24(日) 00:40:37 ] >>618-619 なるほど、非常によくわかりました。 (つーか前出のリンク読まずにレスして申し訳ない) うーむ、しかし末尾再帰が最適化されることの旨みは、 ・ローカルスコープの値をスタックに積む必要がなくなることと ・連続するreturnが省略されること の2点だと思うけど、foldl のように結局は遅延評価のための computation がスタックに積まれていて、後から順次簡約するなら 「最適化されている」とは言い難い気もするな・・・。 最適化するための然るべき変形は、一応してあるんだろうけど。 まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?
621 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:54:46 ] ↓にも関連した話が載ってる。 itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?P=2
622 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 13:10:00 ] ■■学校を作ろう!■■ VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ) パートスレになるんでパー速(GEP)に移動している。 今スタッフを募集しているから、来てくれないか? ■Wiki www36.atwiki.jp/vipvipschool/ ■募集スタッフ プログラム担当(特にErlang、Perl) デザイナー(サイト上のアイコン、ロゴなど) WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける) 他にも宣伝担当なども募集している。 ■スレ ex14.vip2ch.com/test/read.cgi/news4gep/1219068297/
623 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 16:41:26 ] 「特にErlang」… 実用性でいうとやっぱErlangなのかな…
624 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 18:20:21 ] >623 大規模なWebサービスを構築するのに向いていると 考えたから企画者がErlangを採用したんだろうね。
625 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:10:25 ] 大規模な、ってのがクセ者で、 実情は単にDBのテーブルが大きいだけだったりするよな。 そもそもウェブアプリでDB以外どこが肥大化するよ?
626 名前:デフォルトの名無しさん [2008/08/25(月) 09:11:28 ] 画面?
627 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:20:29 ] >>625 複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、 別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。 それともデータサイズの規模に限定した話?
628 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:53:32 ] >>625 とりあえずErlang + YAWSの事例くらいは、 念頭においてくれないと、話にならないのでは?
629 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:55:11 ] >>627 > 複数のwebサービスから情報集めたり、 そういうのはAjaxでクライアント側がやるのが流行では? まあサーバ側がやってもいいですが、HTTPセッションを入れ子にするのは あまり筋がいい設計とは思えません。 > もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、 まあDB接続なんかもそうですよね。 しかし「大規模になる」ような要因とはあまり考えられないのですが。 > 別プロセスで並列キューに入れて処理しなきゃいけなかったり、 fastcgiとかの話でしょうか?特段、だから大規模になるというものではないと思いますが。 > それともデータサイズの規模に限定した話? コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で 用が済むことが多いと思います。特に、>>622 のような、いかにもCMSっぽいシステムでは。
630 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 10:00:08 ] >>629 > コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で > 用が済むことが多いと思います。特に、>>622 のような、いかにもCMSっぽいシステムでは。 よいCMS系フレームワークを、 容易に開発できるかどうかって話をしているんだと思いますよ。
631 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 10:54:21 ] >>630 なるほど、わかりました。 格納するコンテンツの量は結局DBのサイズの問題になると思うので、 それ以外の「大規模」の要因というと、 ・同時接続数(パフォーマンス) ・登録ユーザー数 ぐらいでしょうか。 それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。 「学校」というドメインが明確になっているので、 一般のCMSフレームワークほど汎用化は要求されないし、 どのような要因でコードサイズが「大規模」化するのか興味があります。
632 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:22:00 ] >>624 Apacheとか使わずErlangでサーバー構築するんじゃないの?
633 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:26:39 ] キッチンシンクアプローチか……
634 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:01:50 ] Erlangをわざわざ使うということは、数百レベルの並列プロセスを マルチコアで何とかしようと考えていると見て間違いない。 Webだとすれば、WebServer以外考え難い。生徒数千でほぼ 同時にアクセスがあるとか。
635 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:13:15 ] しかし、>>622 はなんでErlangスレに書いてないんだ?w
636 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:41 ] 単に初期メンバーにErlang使いが居ただけなじゃいの?
637 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:52 ] Erlangスレ見たことない方ですねw
638 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:42:02 ] Erlangはどうでもいいんだけれど、 HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、 確保されているインターフェイスを介してHaskellで利用するというやり方は 多くなるんじゃないかな。短時間で開発する一手法としてね。
639 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:57:49 ] ならないね。
640 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 14:13:29 ] >>638 落日のPerlを使うかどうか。 規格書の通りに一からすべて開発するのは確かに大変だね。
641 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 00:21:14 ] Text/ParserCombinators/ReadP.hsとKoen Claessen氏のペーパーを読んで思ったんですが、 Haskellに慣れてくるとこの実装が直感的に見えてくるんですか? Haskellのパーサコンビネータ関連のペーパーを読んでいない状態でReadPを読んで、 data P a = Get (Char -> P a) 略 | Result a (P a) 略 なのを「え、一番直感的じゃん」 とか、 newtype ReadP a = R (forall b . (a -> P b) -> P b) で instance Monad ReadP where return x = R (\k -> k x) ← これとか fail _ = R (\_ -> Fail) R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k)) ← これとか とか get = R Get ってなるを、「ああ、自明だなすげえ直感的」みたいに理解できるようになる物なんですかね。。難しすぎる。。。
642 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 00:29:58 ] >>629 大規模になる要因なんていくらでもあるじゃん。 今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。 分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。 何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。 学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。 まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。
643 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:08:51 ] といったって、googleも複雑なシステムとか言われてるけど、 googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。 台数は1台だけど自宅で似たようなことやってるもん。
644 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:11:38 ] >>641 P のような再帰的な型のモナドを、 効率のために継続モナド(ReadP)で包むのは定石。 Haskell への慣れっていうより、 モナドや継続モナドへの慣れの問題な気がする。 P は問題によって様々だけど、 ReadP のとこは Control.Monad.Cont の 一般的な継続モナドと(型を除いて)同じなので、 それを理解しておくと問題に集中できていいかもよ。
645 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:13:32 ] つ チラシの裏
646 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:21:08 ] >>642 それはバックエンドで動いている他プロセスが複雑なのであって ウェブアプリが複雑なわけではないのでは?
647 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:32:48 ] >>625 機械翻訳とかではなくて?
648 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:38:57 ] >>644 どうもレスありがとうございました。 >P のような再帰的な型のモナドを、 >効率のために継続モナド(ReadP)で包むのは定石。 これは初めて聞きました。どうもありがとうございます。 確かに If we want to build monads on top of a continuation based programming paradigm, such as stream processors or continuation based I/O in Haskell, we need to build a monad around the continuation based operations. って書いてあるペーパーを見付けました、その継続ベースの方法について考えながら考えていこうと思います。
649 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:52:43 ] www.cs.chalmers.se/~augustss/AFP/monads.html でしょ
650 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 19:00:04 ] >>649 そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。 例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。
651 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 06:47:20 ] >>648 P みたいなのを継続ベースともいうけど、 ReadP を使うのは純粋に効率のためで、 そこに書いてあるのとは話が違うような。
652 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 11:12:38 ] > 純粋に効率のためで そう単純化されても…
653 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 14:48:42 ] いや、単純だし…
654 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 21:41:23 ] 具体的にどういう場合にどうして効率が良くなるんですか? ReadPだと、PがReadPで包まれてるわけだけど、 get' = Get return look' = Look return sat' p = do a <- get' ; if p a then return a else Fail char' c = sat' (c == ) string' s = do str <- look' ; scan s str where scan [] _ = return s scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys scan _ _ = Fail みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。 www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。
655 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 14:13:46 ] ReadPはdata宣言じゃなくてnewtype宣言だから、 記述上は包まれた形になってるけど、実装では包みが外れた形になる。 参照: haskell.g.hatena.ne.jp/jmk/20061203/1165141002 Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?
656 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 15:53:54 ] >>655 どうもありがとうございます。 実際にはReadPの所はR Get やR Lookなどが渡されることになりますよね。 そのあとすぐにrunで即Rはずしてますし。 >Pは直接的にはうまく束ねることができないから これってどういう意味で仰ったんですか? P を束ねてパーサとして使うことも、実際できる(>>654 のget'など)のでわざわざどうしてReadPにするのか、 Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて 私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。
657 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:28:28 ] >>654 ReadP の計算で左結合になってる >>= がある場合でも、 内側の P の >>= をすべて右結合にすることで、 P の >>= の再帰が無くなって効率が良くなる。 9節の第1パラグラフに書いてある通りなんだけど。 左結合を右結合にってのは、>>= の結合則 (m >>= f) >>= g == m >>= (\a -> f a >>= g) の左辺を右辺にするってな話。 例えば、string s >>= f でも string s の中で >>= を使ってるので、左結合になってる。 つまりほとんど全ての場合に当てはまる。
658 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:29:19 ] 効率が悪くなる事情は、そこにも書いてあるようにリストの ++ と同じ。 リストの ++ は左引数に関して再帰する。 [] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) そのため (xs ++ ys) ++ zs は xs に関して二重に再帰することになる。 foldr (++) [] (map show [1..10000]) foldl (++) [] (map show [1..10000]) 実際これらを実行してみると前者はすぐ終わるけど、後者は "1" を10000回結合、 "2" を9999回結合、... "10000" を1回結合、みたいになって遅い。加速してくけど。 遅いだけじゃなく、中間リストを生成するので無駄にメモリを使うことにもなる。 foldl は極端な例だけど、foldr も極端で、いつも無駄が無いようにはいかない。
659 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:30:18 ] で、回避策。 xs ++ ys は、xs の最後の [] を ys に置き換える。 それを効率よくやるには、最初っから [] なんか使わないで、 1:2:3:[] を \nil -> 1:2:3:nil みたいにしとけばいいじゃんという発想。 つまり [a] を [a] -> [a] に、xs を xs ++ に、++ を (.) にする。 こうしておくと、[] を与えてリストに戻すときには、 (.) が右結合になってなくても ++ は右結合になる。 (((xs ++) . (ys ++)) . (zs ++)) [] = ((xs ++) . (ys ++)) (zs ++ []) = (xs ++) (ys ++ (zs ++ [])) = xs ++ (ys ++ (zs ++ [])) 実際 String の ++ を頻繁に使う class Show あたりでは、 できるだけ type ShowS = String -> String を使うことになってる。 shows :: Show a => a -> ShowS を使ってさっきの foldl (.) id (map shows [1..10000]) [] をやってみると、今度は問題無く速い。
660 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:31:29 ] で、ReadP。 m >>= f (P の >>=)は、m の最後の return a を f a に置き換える。 それを効率よくやるには、最初っから return なんか使わないで、 Get (\c1 -> Get (\c2 -> return [c1,c2])) を \k -> Get (\c1 -> Get (\c2 -> k [c1,c2])) みたいにしとけばいいじゃんという発想。 つまり P a を forall b. (a -> P b) -> P b に、 m を m >>= に、>>= を \m f k -> m (\a -> f a k) にする。 以下略。
661 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:32:22 ] で、余談。 foldr c n xs は、xs の : を c に、[] を n に置き換える。 それを効率よくやるには、最初っから : や [] なんか使わないで、 1:2:3:[] を \c n -> 1 `c` 2 `c` 3 `c` n みたいにしとけばいいじゃんという発想。 つまり [a] を forall b. (a -> b -> b) -> b -> b にする。 リストに戻すときは build xs = xs (:) [] を使う。 すると foldr c n (build xs) ==> xs c n と変換できる。 map f xs <==> build (\c n -> foldr (c . f) n xs) 例えばこういう変換を定義すれば、 (map f . map g) xs = map f (map g xs) ==> build (\c n -> foldr (c . f) n (build (\c n -> foldr (c . g) n xs))) ==> build (\c n -> (\c n -> foldr (c . g) n xs) (c . f) n) ==> build (\c n -> foldr (c . f . g) n xs) ==> map (f . g) xs のように map f . map g ==> map (f . g) という変換ができる。 map f . map g 以外にも、他のいろいろなリスト関数の foldr/build を使った形への変換を定義しておけば、いろいろな変換ができる。 foldr/build による融合変換ってやつ。今の GHC もこれを使ってる。 詳しくは GHC User's Guide の 8.13. Rewrite rules あたりを見てくれ。
662 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 18:19:15 ] >>657-661 とても分かりやすい解説どうもありがとうございます! ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。 とてもご丁寧にありがとうございました。 流石だ。。。
663 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:34:32 ] Haskellが宣言型言語とか最初に言い出したのは誰なのかしら
664 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:44:45 ] imperative language ←→ declarative language の対比で ごく自然発生的なものだと思うが?
665 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:07:29 ] 宣言型言語 = what(何をしたいか)を記述 手続き型言語 = how(どうやるか)を記述 クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな
666 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:38:36 ] >>665 宣言型言語=述語論理を記述 と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。
667 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 03:38:00 ] >>665 > クロージャをいかに早めに潰すかに苦心 ってどういうこと?
668 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 09:45:13 ] >>667 関数のインライン展開のようなものじゃないか よく分からんが 関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする だからどう書くか (how) を工夫する 人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる というのは 素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず
669 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:47:12 ] 計算資源が有限なため、howが分からないとwhatも記述できないという罠
670 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:59:09 ] 本質的には what -> how の書き換えと how -> how の最適化は似たようなもんだからな。 最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。 LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。
671 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 17:18:22 ] >>667 >>600 前後の流れ参照 要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある
672 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 20:51:42 ] しかし、そんなこと言ってたらprologだって宣言型と言えなくなるんじゃない?
673 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 21:42:38 ] お前らは 人間の性格はA型B型O型AB型の4種類に分けることができる とか思ってそうだよな。
674 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 23:36:24 ] なんでも過不足なく分類できると思い込む愚かさ 血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ どっちをさしてるのか紛らわしいので例としては不適
675 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 01:06:10 ] >>674 おもしろおかしい
676 名前:デフォルトの名無しさん [2008/09/01(月) 07:57:32 ] www.realworldhaskell.org/blog/2008/08/22/our-writing-is-now-complete/ 書き終わったって。
677 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 15:40:49 ] zipで(ry
678 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 14:15:50 ] >>666 プ 試しにZあたりの実行系でもつくってみればw
679 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 17:56:25 ] >>678 何が言いたいのははっきり言え。 小馬鹿にするだけでは情報価値ゼロだぞ。
680 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:50:51 ] 述語論理なめんな、ってことじゃね? せめてホーン論理に限定するとかじゃないと話にならんだろ。
681 名前:デフォルトの名無しさん [2008/09/03(水) 23:53:10 ] 関数とKleisli以外のメジャーなArrowってあるの?っていうかArrowって死滅したの?
682 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 00:04:13 ] >>676 おお!でも英語疲れる。訳書出版の予定はないの?
683 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 01:25:52 ] >>681 死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。
684 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 11:41:24 ] このスレって嘘多いよな。
685 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 12:00:02 ] このスレって〜 ってレス多いよな。
686 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:00:58 ] そういえば、大学入試のときに大学ランクとタバコの関係に気づかされたなぁ・・・ 東大 誰も吸っていない 京大 誰も吸っていない 同志社大 ちらほら 関西大 校舎内で吸っているやつがいる(!!!) ありえないです、低ランク大・・・ やっぱりランクの低い大学出身のやつは信用できない・・・
687 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:19:00 ] そして増える意味不明なレス
688 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:20:04 ] >>684 素人なのでどの変がうそなのか教えてください
689 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:45:52 ] 686みたいな奴がhaskellを使うとはとても思えんのだが、 何しに来てるのかね?
690 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:50:35 ] >>689 Haskellがどういうものだと思っているんですか?
691 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 17:36:25 ] >>686 は今マルチされてるコピペ、スルー推奨です。
692 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:33:03 ] >>690 全角数字を見るといらっとくる人が使う言語
693 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:35:16 ] 確かにイラっときた
694 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:21:38 ] >>693 それはカルシウム不足
695 名前:デフォルトの名無しさん [2008/09/06(土) 23:15:53 ] Haskellで良いコード綺麗なコードというのはどんなコードですかね。 出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、 あるいはそれ以外でも、何でも。
696 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:55:28 ] >>695 y f = f (y f)
697 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:05:33 ] >>695 haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。
698 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:12:32 ] 良いコード: 意味のあるところでControl.*を使う 悪いコード: ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport
699 名前:デフォルトの名無しさん [2008/09/07(日) 00:15:18 ] っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。 >>687 ライブラリはそうだろうけど、普通のアプリを書くときは?
700 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:33:20 ] 単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。 複雑な場合には無理をしても分かりにくくなるだけだから悪い。 パターンマッチとは使いどころが違う。
701 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:34:19 ] >>699 圧倒的に短く書けるからだよ。 それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい
702 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:41:52 ] まっすぐだけど、流れが逆じゃん。 というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?
703 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:46:48 ] GUIアプリを書くときはどういうのが綺麗なんだ?
704 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:59:26 ] >>702 逆なの? y = f x より x f = y が脳味噌に合ってるの?
705 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:11:04 ] >>704 なんでやねん。 unlines . take 10 . filter (> 10) . map read . lines より、 lines >>> map read >>> filter (> 10) >>> take 10 >>> unlines の方が、少なくとも俺は脳に優しく感じる。 で、こう書くと、map read と filter (> 10) を分けてるのが冗長でダサい気もするが、 (filter (> 10).read)みたいにした方が良いのか、かえってこっちの方がダサいのか、 あるいは、(filter (\x -> 10 > read x)) みたいにラムダにすべきなのか、綺麗の勘所が判らんのです。
706 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:12:53 ] >>705 あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。
707 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:32:55 ] >>705 String に戻さないといけないなら filter ((10 <) . read) だろう。ラムダでもいいけど。 まあ、その辺はこだわるとこでもないかと。 > なんでやねん。 f (g x) と (f . g) x の向きは関係あるんですよ。 数学でも向き的事情から x^f という記法を使うこともある。
708 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:23:43 ] >>702 左から右だろうが右から左だろうがどっちでも一緒だろ。 俺には違いが分からん。
709 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:27:05 ] >>702 こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。 なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。
710 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 03:31:39 ] 現代日本では横書き文字は左から右だから、 その方が自然に感じるのは当然と思います。 また、bind演算子が(>>=)で左結合である事を考えても Haskellを設計した人もその方が自然と感じたのではないでしょうか? 慣れの問題かもしれませんが、 そんなにおかしな意見とは思えません。
711 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 07:34:52 ] まあ関数合成の向きが右から左なのは>>707 の説明の通りだし、Haskellに限らず数学でも同じルールだからな。数学でも気持ち悪いって云う人は結構居るしまあそんなに変わった意見でもあるまい。
712 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:48:37 ] 社内コーディング規約でここにスペースを入れろとかそういうのよりは高尚が感じがするかもしれないけれど 所詮バイクシェッド 乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる 数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。 しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ
713 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:56:43 ] 亀だが >>36 >FPGAとかのHDL記述とかに応用したりしてる人いないの? Lavaがあるよ。並列性とか関係ないし、回路をそのまま関数で書くだけなんだけど。そしてVerilogより使いやすい、なんてこたーない。HDLよりましだが、副作用を書くのがまわりくどい www.cs.chalmers.se/Cs/Grundutb/Kurser/svh/tools.html
714 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:31:52 ] s/HDL/VHDL/
715 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 21:55:12 ] >>713 ArrowっぽいHDL作りたいな
716 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 18:48:21 ] Real World Haskell November 15, 2008 待ち遠しい。
717 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 22:50:22 ] 過度の並列化で複雑化するゲーム開発 コスト削減の鍵は純粋関数型言語らしい www.watch.impress.co.jp/game/docs/20080911/epic.htm
718 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/12(金) 22:54:50 ] >>717 そうだろうね。 俺はずううっと前からそう論文に書いてたけど。 だんだんpi-calculusの人気が出てきたね。
719 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 23:58:55 ] > Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、 >将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。 >Sweeney氏はそのひな形として言語“Haskel”を挙げているが、 >ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。 なんでHaskellは駄目なんだろう。 ライブラリ含めた開発環境の問題か処理系の最適化の問題か それとも言語仕様レベルで本質的に向いていないのか。
720 名前:デフォルトの名無しさん [2008/09/13(土) 00:06:19 ] 前者じゃない?
721 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:09:07 ] こんなことでもないと注目せんのだな
722 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:48:51 ] 遅延評価に漬かりまくりで、ダメなのでは? 遅延評価って言ってみれば、後ろからの逐次でそ? 無限リスト使えないHaskellってHaskell?
723 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 07:07:42 ] LazyがいやならSMLやOCAML使えばいいだけ。何が不足よ?
724 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 08:23:12 ] >>723 前方参照,where構文
725 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 09:32:44 ] >>724 LETで何が不足よ?
726 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 10:42:16 ] >>717 ,>>719 からのコンテキストを読んでくれよ。
727 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:14:08 ] 質問です たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、 Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?
728 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:21:45 ] >>727 関数
729 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:00:09 ] >>727 「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか >Haskellの代数的データ型に格納されたデータ これどういう意味? 型が代数的データ型であるような値のことならそのまま「代数的データ型の値」 代数的データ型の構築子に渡した値のことなら「フィールドの値」くらいか? data Point = Pt Int Int x = Pt 0 3 -- xはPoint型の値 -- xのフィールドの値は0と3
730 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:26:27 ] Haskellのプログラミングスタイルのことはなんて呼べばいいですか? ストリーム指向?
731 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:30:20 ] 関数指向
732 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:55:40 ] Haskell系のShellでオススメってある?
733 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/17(水) 00:00:30 ] >>732 シェルって何のこと? 言語とは関係ないと思うけど。 シェルスクリプトのことを言っているの?
734 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:07:44 ] >>733 HSHみたいなやつ 探してみた奴だとどれも開発止まってて…
735 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:09:07 ] Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ
736 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:15:11 ] Haskell系の自然言語でオススメってある?
737 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:22:13 ] lojbanとか? 自然言語じゃないけど
738 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 15:52:29 ] Yiとか使ってる人いるの?
739 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:56:30 ] Yi って 彝 ?
740 名前:デフォルトの名無しさん [2008/09/17(水) 18:20:56 ] ぅぃ?
741 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 18:31:27 ] haskell.org/haskellwiki/Yi 使ったこと無いなぁ。
742 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:29:49 ] ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。 並行指向プログラミングというのかな? このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。 Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。 # erlangの構文は糞 糞 糞 糞杉
743 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:18:31 ] ぅぃゅ
744 名前:デフォルトの名無しさん [2008/09/19(金) 20:28:25 ] コンカレントハスケル?
745 名前:デフォルトの名無しさん [2008/09/19(金) 20:34:40 ] ああ、コンカレントは並行だったか・・・
746 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:42 ] >>743 私はProlog屋なので、erlangの構文のクソ部分に敏感でない。 お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。
747 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/20(土) 12:04:07 ] >>742 たぶん、その思想というのはpi-calculusのことかな。
748 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:08:03 ] ここのみんなからするとgtk2hsって綺麗なの?
749 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:29:19 ] Erlangってpi-calculusベースなのか
750 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:56:48 ] >>746 743ではないけど、 receive...endとか、カリー化できないとかではないですか?
751 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 14:52:33 ] >>723 元記事ではSTMが挙げられてるけど、OCamlだと無くね? >>749 綺麗って何が?Gtk2Hsを使ったコード? それならあまり綺麗じゃないんじゃない。 GUIを綺麗に書くためのハイレベルなライブラリは いろいろあるけど、どれも決定打にはなってないような。
752 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:23:34 ] >>751 >>749 じゃなくて >>748 ?
753 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:27:39 ] >>752 >>748 な俺からでもそれはわかる。
754 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:46:57 ] gtk2hsと言えば、 gtk_rc_parse_string相当の関数や、 gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。 いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。 皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか? 大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。
755 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 12:17:25 ] いや、検索能力の問題じゃなくて、実際に無いんじゃない? Gtk2Hsのソースgrepしてみて無かったら無いような。
756 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 08:20:06 ] webで読んでるけどreal world haskell凄いヴォリュームだな 一週間やってもまだ終わらん 製本版はもう鈍器レベルだな
757 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 09:55:41 ] なにか面白いこと書いてあった?
758 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 15:02:13 ] これでしょ book.realworldhaskell.org/read/
759 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:29:27 ] url知らないって意味じゃなくて、自分では読む気が無いってことだよ。
760 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:37:06 ] ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。 たとえばデータベースと通信する方法とか、 GUIを作るときのライブラリとかツールとかの紹介とか、 どちらかというと「Haskell逆引きクイックリファレンス」 みたいな感じだね。 目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。
761 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:11 ] いろいろサンプルコードも載ってるからわかりやすい。 文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。
762 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:49 ] 良 → 量 コードの両方 → コードの量
763 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 11:57:39 ] Parsec.Tokenをロードすると ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.') とでて読み込めないのですがどうしたらいいのでしょうか
764 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:09:05 ] >>763 Hugsを標準モードじゃなくて拡張モードで起動すればいい hugs -98
765 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:51:18 ] >>764 無事読み込めました。ありがとうございます
766 名前:デフォルトの名無しさん [2008/09/24(水) 15:23:46 ] do構文で、変数の使用が強制されるのはなんとかならんの? .とか$とかの気の利いたバージョンない?
767 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:27:56 ] 何を言ってるのかよく分からんが >>= とか?
768 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:36:59 ] >>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。 do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。 つまるところ>>=になっちまいそうな気もするけど、 便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。
769 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:11:24 ] なにか具体例見せてくれ
770 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:18:02 ] do式の中で、 a <- v b <- f a は、aを使わずに b <- v >>= f と書ける 同様に、 a <- v let b = f a は、 b <- liftM f v と書ける こういう話? >>=は普通にdo構文の内部で使えるよ 俺はこの場合=<<を使う方が好きだけど
771 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:26:30 ] 何を言ってるのか俺もよく分からん。 do ...; a <- m; f a; ... を do ...; f =<< m; ... -- m >>= f でも同じだけど... とか do ...; a <- m; let b = f a; ...; g b; ...; h b; ... を do ...; b <- liftM f m; ...; g b; ...; h b; ... とかすればいいって話じゃなくて? って書き込もうとしたんだけどその前に新着レス見たら>>770 被りすぎ。
772 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:44:57 ] n <- m a <- n を a <- join m にするパターンもあるかも。 n <- m o <- n a <- o を a <- join (join m) とか。
773 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:48:50 ] ぱっといい例は書けないけど、例えば単純な例で do args <- getArgs cnt <- getContents now <- getClockTime return someFunc args cnt now を、 do return soumeFunc #getArgs #getContents #getClockTime とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)
774 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:53:15 ] >>770 ,771,772 ありがとう。特にjoinは使った事なかった。 俺がアホでした。
775 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:56:54 ] あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。
776 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:01:37 ] というか、liftM3ですね。とりあえず釣って来ます。
777 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:21:21 ] ちなみに、 do args <- getArgs cnt <- getContents return otherFunc args True cnt だったら?
778 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:27:31 ] >>773 みたいな構文は俺も欲しい このスレで前に同じことを書いた記憶がある Template Haskellを使えばなんとかなるかな >>777 liftM3 otherFunc getArgs (return True) getContents 不恰好だけど
779 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:03:09 ] >>773 は Control.Applicative を使って soumeFunc <$> getArgs <*> getContents <*> getClockTime や return sumFunc <*> getArgs <*> getContents <*> getClockTime って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。 っていうのは (return soumeFunc) #getArgs #getContents #getClockTime じゃなくて return (soumeFunc #getArgs #getContents #getClockTime) のつもりだろうから嘘だけど。 ただ、IO は Applicative のインスタンスになってるけど、 一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。 でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。 <$> とかの Control.Applicative にあるいろいろな関数がないけど。 あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど それを f *$ x = f <*> pure x とか定義すれば liftM3 otherFunc getArgs (return True) getContents は otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。
780 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:18:11 ] おおっ、あるのね。 俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。 まあ、>>698 とか見ると、>>778 の書き方が普通は落とし所って所かも知れんけど、調べてみます。
781 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:29:43 ] windows環境でunix 2.3.0.0のインストールに成功した方っていらっしゃいますか? 私の環境では以下のエラーを吐いてbuildに失敗します。 compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o どなたか知恵をお貸しください --unix.cabal >The package is not supported under Windows (except under Cygwin). Windowsは基本的に非サポート、 Cygwin環境下はOKという意味だと思ったんですが違いますか?
782 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:58:13 ] 長くて貼れなかった部分(すみません)のログを見てみると cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。 終電の時間が近いので、検索パスの追加をした所で今日は帰ります
783 名前:デフォルトの名無しさん [2008/09/25(木) 00:01:22 ] 仕事でハスケル使ってんの?
784 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:25:45 ] 言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0
785 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:02:05 ] 学生だろ?
786 名前:デフォルトの名無しさん [2008/09/25(木) 03:18:09 ] 学生のうちから終電まで勉強してんのかよ。 そんなんじゃ社会に出てからもたんぞ。
787 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:51:42 ] Schemeのcondみたいのはどう書くのがよいでしょうか? case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。 case dummy of _ | conditionA -> bar | conditionB -> foo otherwise -> baz
788 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 04:41:08 ] そこだけ別函数にしちゃえば良いんじゃ?
789 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:37:19 ] >>786 何という優しさ。
790 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:56:07 ] こういうsyntax sugarが欲しいなあ。 data X = A | B | C | D case x of A | B -> 1 C | D -> 2
791 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:58:51 ] 確かに欲しい でも縦線だとガードに見えるから別の記号が要るな
792 名前:781 mailto:sage [2008/09/25(木) 20:53:49 ] だめでした。 定義されていない型、定義されていない関数のエラーは HsUnix.hに手を加えてなんとかしましたが(includeするファイルを追記) ↓結果 dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x49):Module_hsc_make.c: undefined reference to `_impure_ptr' dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x8d):Module_hsc_make.c: undefined reference to `_impure_ptr' dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xb5):Module_hsc_make.c: undefined reference to `_impure_ptr' dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xe9):Module_hsc_make.c: undefined reference to `_impure_ptr' collect2: ld returned 1 exit status linking dist\build\System\Posix\DynamicLinker\Module_hsc_make.o failed それはともかく、今夜はwww.haskell.orgに繋がりにくいですね
793 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:22:23 ] >>790 そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。
794 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:03:38 ] 流行に乗ってHaskellを勉強しているのですが、バイナリファイルの扱い方に困ってます。 int numFloat; int numInt; float floats[numFloat]; int ints[numInt]; C的な擬似コードで書くとこんな感じのバイナリファイルに対して、 floatsとintsのデータを取ってきて文字列でフォーマット化して表示してみよう、と思っています。 hFile <- openFile filepath ReadMode cs <- hGetContents hFile ひとまずこれで[Char]を持ってきて、そこからnumFloatとnumIntを切り出せばよいか、 と思ってるのですが、じゃあそれってどうするんだろう、ってところで詰まってます。 (numFloat,numInt,残り) = hogeFunction cs みたいな感じで切り出すのが関数型的な感じなのかな、と思っているのですが、 そもそもこの辺の考え方からして駄目っぽいですか?
795 名前:初心者修業中 mailto:sage [2008/10/01(水) 23:29:57 ] >>794 バイナリモードじゃないとダメなんじゃないでしょうか? こんなのがありました ↓ ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html
796 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:38:17 ] >>795 ありがとうございます。 BinaryModeって付けないと駄目なのと、 あとPtrを経由してデータを取ってくるんですね。 これで勝つる!
797 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ] べつにPtrを経由しなくても>>794 の方針でいけるよ 効率を気にするなら別だけど
798 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:27:22 ] Ptrを経由しないとバイナリ表現のFloatから HaskellのFloatを得る手段が難しいよ。 thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927
799 名前:初心者修業中 mailto:sage [2008/10/02(木) 00:56:54 ] >>797 テキストモードの場合、、 control-ZをEOFと認識したり、CRLFを LFに変換すると GHCのマニュアルにありますが、 問題ないのでしょうか?
800 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:06:55 ] >>799 問題ある >>797 は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った >>798 確かにそうだな ちゃんとテストしてないけど一応こんなんでいけるみたいだ import Data.Bits import Data.Word w32ToFloat :: Word32 -> Float w32ToFloat w | ep == 255 && sf /= 0 = 0 / 0 | sf == 255 = sign / 0 | sf == 0 && ep == 0 = sign * 0 | otherwise = sign * encodeFloat r e where sn = shiftR w 31 ep = shiftR w 23 .&. 0xff sf = w .&. 0x7fffff sign = if sn == 1 then -1 else 1 e = fromIntegral ep - 127 - 23 r = fromIntegral sf + 0x800000
801 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:37:29 ] バイト列をFloatとして解釈させたいわけだから、 必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。 というわけでPtr経由だけど書いてみた。 import Foreign fromBytes :: Storable a => [Word8] -> a fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p) toBytes :: Storable a => a -> [Word8] toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p) toBytes (0.5 :: Float) => [0,0,0,63] fromBytes [0,0,0,63] :: Float => 0.5
802 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:32:32 ] で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。
803 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:50:10 ] endian変更は[Word8]にreverseかければ良いんじゃね。 システムのendian判定はこんな感じ? isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0] isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]
804 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:03:52 ] やっぱり>>800 にはバグがあった - | sf == 255 = sign / 0 + | ep == 255 = sign / 0 >>802 [Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ この場合PtrやUArrayを経由するのでもencodeFloatでも良い
805 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:35:05 ] -- テストしてみた。 -- import Test.QuickCheck (f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)] forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property forAllBinaryFloat t = forAll (choose (0,1)) $ \s -> forAll (oneof [elements [0,255], choose (1,254)]) $ \e -> forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f -> t (sefToBytes s e f) sefToBytes :: Int -> Int -> Int -> [Word8] sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3] where [_,f1,f2,f3] = endian (toBytes f) [s',e'] = map fromIntegral [s,e] endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id prop_float :: (Float -> Float) -> Property prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl) where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary] prop_bytes :: ([Word8] -> [Word8]) -> Property prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)
806 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:36:01 ] -- quickCheck test1 や verboseCheck test5 とかで実行。 test1 = prop_float (fromBytes . toBytes) test2 = prop_float (w32ToFloat . fromBytes . toBytes) test3 = prop_float (uncurry encodeFloat . decodeFloat) test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float)) test5 = prop_bytes (toBytes . w32ToFloat . fromBytes) test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==> (fromBytes `eq` (w32ToFloat . fromBytes)) bs {- 1, 3 は通った。最初 NaN/=NaN をうっかりした。 w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。 4 は NaN のときに、仮数部の最上位ビットがおかしくなった。 5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。 NaN の表現が変わるのは Float を解釈する場面 (つまりコピーとかじゃない)なら問題無いだろうけど。-}
807 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:41:10 ] QuickCheckすげー 盲目的なランダムテストだけじゃないのな 概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、 ネイティブのFloatに変換して使いたいのか、 それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな 実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど
808 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:51:57 ] QuickCheckってどうも使い方が解らない。 テストが元実装と結局ほとんど同じにならない? 元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、 結局同じになるのは必然だと思うんだけど。 仕様から演繹出来る他の事を確認しろって事かな? でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
809 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:06:21 ] >テストが元実装と結局ほとんど同じにならない? ならない。>>805-806 を見れば分かる通り >元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、 >結局同じになるのは必然だと思うんだけど。 そういう場合もあるし、そうでない場合もあるから、決して必然じゃない たとえば、ソート関数が正しいかどうか確認するコードと、 実際にマージソートやクイックソートをするコードは全然違うものになる さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし >でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね? もちろん だれもテストで全ての誤りを発見できるとは思ってない
810 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:26:34 ] あと、ランダムテストが有効な場合とそうでない場合があるよね。 >>805-806 はあまりランダムである必要が無いかも。 きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を 並べ上げにくい場合にランダムテストが有効な気がする。
811 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:35:10 ] ああそうか、例えばソートの例の場合、 「正しくマージソート出来てるか」じゃなくて 「正しくソート出来てるか」のテストになるからか。 前者はQuickCheckに関わらず外部テストでは確かめようがないから、 「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。
812 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:36:28 ] 単なる関数じゃあまり意味がなくて、 結果としてのアウトプットが特徴的で綺麗な性質を持ち、 かつ、その性質自体が目的である場合に威力を発揮するって感じか。 その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。
813 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:38:09 ] 2chって連続した半角スペースが に置換されるようになったの? f :: A -> B のテストは ・B (or A) の == を使う場合 ・一般の場合 ・h :: A -> B を用意して f x == h x をテスト ・逆関数 g :: B -> A がある場合 ・x == g (f x) をテスト ・y == f (g y) をテスト ・使わない場合 ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト (テストはランダムな x :: A, y :: B に対して) 大概こんな感じ。 元実装とほとんど同じテストってのは、 g やうまい r が無くて、f x == h x というテストしか無いんだけど、 f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、 == を明示的には使わないで実質的に f x == f x と同じことをやる、 みたいな感じじゃないかな。
814 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:39:53 ] うわ俺バカ丸出し。&nbsp;って書きたかった。
815 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:31:09 ] datを直接見るようにすればnbspなんて使わなくてもインデントされるよ
816 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:19:55 ] 滅茶苦茶な事を聞いていそうで済みませんが、 cabal configure と runhaskell Setup.hs configure、 cabal build と runhaskell Setup.hs build、 cabal install と runhaskell Setup.hs install、 って何か違うんでしょうか。 同じだとしたらなんのために両方あるんでしょうか。
817 名前:初心者修業中 mailto:sage [2008/10/08(水) 15:33:21 ] >>816 ・runhaskell はHaskellのソースプログラムを実行するコマンド ・cabal はパッケージをインストールするコマンド …と認識しています。 参考 ↓ ttp://haskell.g.hatena.ne.jp/illillli/20080224
818 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:08:47 ] オラ本でねーぞコラ
819 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:31:08 ] cabal なんてコマンドあるの? あるとしたら runghc Setup と打つより楽だからじゃ?
820 名前:初心者修業中 mailto:sage [2008/10/09(木) 01:00:41 ] >>819 参考 ↓ ttp://haskell.g.hatena.ne.jp/illillli/20080224 cabal-installというパッケージにcabalというユーティリティがあった。 パッケージのダウンロードからインストールまでを自動化してくれるようだ。
821 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:00:42 ] 今んとこ、RubyGemsを目指して整備中って事で、 最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない? page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install hackage.haskell.org/trac/hackage/wiki/RubyGems 現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、 cabal install monadius monadius で遊べるってのは、Setup.hsでは無理だろう。
822 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:20:27 ] >>821 RubyGemsなんて目指されると非常に困る。
823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ] ん?どんな風に?
824 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:20 ] 質問です。 Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか? 今あるコードが rot90 list = reverse (map (head) list) : rest where rest = if length (concat taillist) == 0 then [] else rot90 taillist where taillist = map tail list ですが、ものすごく非効率的だと思います。
825 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ] >>824 length (concat taillist) == 0 の部分を all null taillist にでもすれば別に非効率的でもない気がする 俺ならtransposeを使うな rot90 = transpose . reverse
826 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:24:00 ] >>825 素早い回答ありがとうございます。 実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。 transpose list = rot90 (hflip list) hflip list = reverse list というふうになっております。
827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ] どうしてもrot90でtransposeを定義しなきゃいけないの? そうでなくて単にtransposeが必要ってだけならその定義は捨てて import Data.Listしてtransposeを使えば良いんじゃない?
828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ] transposeって標準の関数ではないんですか?
829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ] >>827 課題では、自分でtransposeを定義しろ、とのことでした。
830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ] >>828 Prelude関数ではないのでData.Listをインポートしないと使えない。 >>829 だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。
831 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:12:45 ] Data.Listのtransposeはこれ transpose :: [[a]] -> [[a]] transpose [] = [] transpose ([] : xss) = transpose xss transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])
832 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:57:02 ] >>813 連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。 >>824-825 長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。 filter 使えば>>831 の transpose に map reverse . したような感じになる。 ([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss)) 違ったやり方なら rot90 = foldl c [] where c yss [] = yss c [] xs = [[x] | x<-xs] c (ys:yss) (x:xs) = (x:ys) : c yss xs とか。
833 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 07:01:54 ] あ、any じゃ list == [] のときまずいという話もあるか。
834 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 00:49:41 ] >>823 パッケージの管理方法にいろいろと問題がある。
835 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:26:24 ] >>834 具体的に言ってくれよ。そして開発者達にも。
836 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:53:56 ] 質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい るのですが、遅延評価が効くようなコードが書けません。 type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。 recursiveFileTree :: FilePath -> IO FileTree recursiveFileTree name = do contents <- catch (getDirectoryContents name) (\e -> return []) children <- let filtered = filter filterDots contents pathadd = map (\x -> name </> x) filtered mapped = map recursiveFileTree pathadd in sequence mapped return (Node (takeFileName name) children) where filterDots :: FilePath -> Bool filterDots "." = False filterDots ".." = filterDots _ = True (インデントしてるように見せるために全角スペースを入れています。見えますか?) おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。
837 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:14:59 ] ・unsafeInterleaveIOを使う ・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う 好きな方を選んでくれ
838 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:22:13 ] 一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい それだとどうしても不便というときのためにunsafeInterleaveIOがある
839 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:12:08 ] f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?
840 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 11:26:17 ] flip使え
841 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:56:42 ] flip (flip f b) cはさすがに悪趣味だろ
842 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 18:02:48 ] (\a -> f a b c) → 15文字 flip (flip f b) c → 17文字
843 名前:デフォルトの名無しさん [2008/10/30(木) 19:39:38 ] ($c).($b).f flip (`f`b) c
844 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:45:59 ] こんなのもありました。 (flip.(flip f)) b c 3引数flip haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265
845 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:54:21 ] >>844 は >>841 の変形だね。 あと、内側の括弧は無くてもOK
846 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:45:30 ] f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね
847 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:03:15 ] SRFI 26 みたいな?
848 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:47:19 ] \x->f x b c
849 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:29:54 ] >>848 >>839
850 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 11:19:22 ] >>846 それだと f # b c -- \a -> f a b cと同等 と (f #) b c -- (\a -> f a) b cと同等 を区別する必要が出てきて面倒だな
851 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:03:16 ] d.hatena.ne.jp/m-hiyama/20081031/1225416719 ブログ持ってないのでここで。酒井さんのパクリ。 {-# OPTIONS -fglasgow-exts #-} import Control.Monad (liftM2) import Data.Either import Test.QuickCheck infix 4 :<->: type a :<->: b = (a -> b, b -> a) (.>) :: a:<->:b -> b:<->:c -> a:<->:c (f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2) un :: a:<->:b -> b:<->:a un (f,g) = (g,f) type a :+: b = Either a b infixr 5 :+: alt :: a:+:b :<->: b:+:a alt = (f,f) where f = either Right Left swap :: a:+:b:+:c :<->: b:+:a:+:c swap = (f,f) where f = either (Right . Left) (either Left (Right . Right)) rt :: b :<->: c -> a:+:b :<->: a:+:c rt (f,g) = (r f, r g) where r = either Left . (Right .)
852 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:04:16 ] data T = L | N T T deriving (Eq, Show) fold :: a:+:(T,(T,a)) :<->: (T,a) fold = (f,g) where f (Left a) = (L,a) f (Right (t1,(t2,a))) = (N t1 t2,a) g (L,a) = Left a g (N t1 t2,a) = Right (t1,(t2,a)) h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a))) h = un fold .> rt (un fold) s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a)))) s = rt (un fold .> alt) .> swap .> rt fold .> alt
853 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:05:44 ] st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a))))))) st = -- T h -- 1 + T + T^3 .> swap -- T + 1 + T^3 .> rt (s .> s .> s .> s -- T + T^4 + T^7 .> alt) -- T + T^7 + T^4 .> swap -- T^7 + T + T^4 .> rt (s .> s .> s .> s .> s) -- T^7 + T^6 + T^9 .> swap -- T^6 + T^7 + T^9 .> un h -- T^7
854 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:08:02 ] instance Arbitrary T where arbitrary = oneof [return L, liftM2 N arbitrary arbitrary] main :: IO () main = do quickCheck $ \x -> x == (snd st (fst st x) :: (T,())) quickCheck $ \x -> x == fst st (snd st x :: (T,())) 型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。
855 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:50:00 ] すげえ、読みやすいな
856 名前:デフォルトの名無しさん [2008/11/05(水) 07:40:02 ] GHC 6.10.1リリースあげ
857 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:34:43 ] ((f.) . g) a b みたいなテクニックが沢山載ってるようなページを教えてください
858 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:06:08 ] unsafeInterleaveIO :: IO a -> IO a unsafeInterleaveIO (IO m) = IO ( \ s -> let r = case m s of (# _, res #) -> res in (# s, r #)) この#って何なんですか?ghc6.8.2ではエラーになりますし…
859 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:38:02 ] >>858 unboxed tupleってやつだね。 itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2 >>856 Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。 6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。 キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して package.confの中の$topdir\\を$topdir/lib\\に全置換した。
860 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:29:51 ] >>859 ありがとうございました 拡張構文なんですね
861 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:45:00 ] weakリダクションって何?
862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:10:49 ] googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか? Haskellの処理系だけを使って、prologみたいなことができないか調べています。 ↓でprologのタプル parent(tom, bob). のような感じにすると、 parent::[Char]->[Char]->Bool parent "tom" "bob" = True parent "liz" "bob" = True parent "mike" "liz" = True parent _ _ = False とりあえず、 main = print $ parent "tom" "bob" main = print $ parent "mike" "bob" で True や False が出て、prologっぽくなります。 そこで、 parent X "bob" という質問に対し、 X=tom X=liz みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか? 入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、 そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?
863 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:23:23 ] >>862 無理 Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い
864 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:43:20 ] 中間形式のグラフみたいなの見れないのん?
865 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:15:29 ] 中間形式のグラフって何? グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、 要するに「未評価の式」を表してるだけだから、それを見ても>>862 みたいなことをする助けにはならんよ
866 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:27:35 ] 少なくとも書こうとしてるプログラムの中からは見れない。 Haskellって厳格な言語で、その手の変なことは基本的にできないよ。 何をやりたいのか知らないけど、インタプリタ的なものを書いて、 それをライブラリとして使えば?
867 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:38:05 ] ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ
868 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:16:43 ] 関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、 先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、 処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。 実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。
869 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:27:38 ] >関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する これはその通り >先にグラフを作って、実行時に、そこにデータを流し込む これはぜんぜん違う 多分どこかで誤読してると思う
870 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:40:05 ] >>867 zs <- everything append [1..100] [1..100] zs こういうやり方じゃ生きてるうちに終わらないかもよ。 Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、 総当りで解を求めようとする非決定性計算ってだけなんで。
871 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:50:02 ] yet another embedding of pure Prolog into Haskell okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs いまいち使い方はわからんけど、ググったら見つかったので貼っておく。
872 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:48:35 ] >>870 failや[]で枝狩り
873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:44:22 ] >>872 変数をどう表現して、何をどう枝刈るの?
874 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:25:24 ] 887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37 Real World Haskellは糞本だと思う
875 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:49:16 ] 出版されたの?
876 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:01:38 ] 出版されたかは知らないけど訳してる人がいる ttp://d.hatena.ne.jp/mokehehe/20081124/rwh
877 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:27:23 ] 始まったばかりにしても、ひでえ訳
878 名前:デフォルトの名無しさん [2008/11/25(火) 23:41:58 ] Real World Haskellって翻訳本が出ると思いますか? マイナーな言語だけど、微妙にブームになってるし 来年ぐらいに出版されたりするかなあ?
879 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:48:26 ] 確かに一時期あったけど、とっくに沈静化したような…>ブーム
880 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/25(火) 23:50:52 ] >>879 最近は沈静化したように見せかけて、ジワジワきてるよ。 各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。
881 名前:デフォルトの名無しさん [2008/11/26(水) 00:04:13 ] うーん、訳の出来とは別になんか期待できなさそうな感じ
882 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/26(水) 00:08:27 ] 原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。
883 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:12:16 ] まだ10章までしか読めてないけど ふつケルの次くらいに読む分には悪くないと思う>RWH タダだし
884 名前:デフォルトの名無しさん [2008/11/26(水) 00:17:39 ] 本買おうと思ったけど、WEBで読めるわけだし 翻訳本が出るまでそれですまそうかなw
885 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:19:34 ] RWHクソだろ〜 11章からはページを増やすためにネタを書きましたって レベルのオナねたのオンパレードだぞ
886 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:36:34 ] RWHってネットでもう出回ってるんだなw
887 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:45:56 ] 出回ってるつーかあれを最近本にしたんでしょ?
888 名前:デフォルトの名無しさん [2008/11/26(水) 00:49:09 ] 存在型ってなんですか?
889 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:23:56 ] バキシルとか大麻のことだ
890 名前:デフォルトの名無しさん [2008/11/26(水) 01:48:33 ] ありがとうございます。
891 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 07:48:38 ] >>888 Cardelli読め
892 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 13:02:02 ] Haskell: The Craft of Functional Programming と Programming in Haskell のどちらがお勧めですか?ふつけるの次くらい。
893 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 21:24:32 ] >>884 下手糞な翻訳の恐れ大。最近多いね、いや昔からか
894 名前:デフォルトの名無しさん [2008/11/26(水) 22:52:49 ] Programming in Haskellはいいよ。ふつけるの前でもいいです。
895 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:14:12 ] >>892 自分はふつけるの後にCraftでした。というか、その間にSICPが あるので、あんまり参考にならないかな。ふつける読んでも ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。 自分は普通の文系プログラマで、関数型プログラミングの世界とは 無縁だったので、SICPをくぐる必要があったと感じてます。
896 名前:デフォルトの名無しさん [2008/11/27(木) 19:30:50 ] Craftはいつ第3判が出るのですか?
897 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:55:34 ] Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。 あとはReal Worldみたいな実用面を書いたものになりますかね。
898 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:02:06 ] ガンズのニューアルバムが出るころに出版されるそうです。
899 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 20:17:32 ] それは出版されないってのとどう違うのだ
900 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 22:32:12 ] 泳げる頃にh(ry
901 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:59:30 ] 1版ならともかく3版なら別に出なくてもいいんじゃね
902 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 00:04:26 ] Implementing Functional Languages: a tutorial ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。
903 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:25:49 ] >>902 著者本人が公開してる。あとは自分で探せクズ。
904 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:27:36 ] >>903 おめーがクズだろ この引きこもりw
905 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:15:40 ] 自演乙
906 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:05:13 ] Haskellで書かれた数式処理ソフトがあると聞いたのですが maximaと比べると 言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?
907 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 09:20:37 ] PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww
908 名前:902 mailto:sage [2008/11/30(日) 09:56:28 ] >>907 自分では探してみましたが、部分的なコードだけしか見つけられませんでした。 ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん ですが。
909 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:00:41 ] 探すもなにも、入手方法ちゃんと書いてあるじゃんwww
910 名前:デフォルトの名無しさん [2008/11/30(日) 21:28:44 ] >>896 2021年4月19日に出るみたいです。 まだ相当先ですね。
911 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 20:25:35 ] どんどん延期してると思ったら 今度はありえないくらいに延ばしたな・・・
912 名前:デフォルトの名無しさん [2008/12/07(日) 12:54:19 ] ghci の補完って windows じゃ効かないんですかね。 Linux 上だとちゃんと動いて便利だったのでショックです。 ネット探してみると rlwrap 使えとかあったけど rlwrap って動的な補完(スコープ内の関数一覧等) って可能なんでしょうか。
913 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:54:21 ] そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな
914 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:56:28 ] 英語配列30g早く!
915 名前:902 mailto:sage [2008/12/07(日) 20:05:48 ] >>909 書いてありました。これって個人でも送ってくれるのでしょうかね。 ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要 になりそうです。ありがとうございました。
916 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:52:49 ] do記法と(>>=)の対応についてですが、 do;putStr "a\n";putStr "b\n";putStr "c\n"; ≡ putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n")) なんですかね? 右結合的になったり匿名関数に変換されたりと難しいです
917 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:24 ] >>916 一緒です。 でも putStr "a\n">>putStr "b\n">>putStr "c\n" と書いた方がきれいですよ。
918 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:57 ] あと、括弧なくても良いですよ。
919 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 10:36:09 ] なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね ありがとうございました
920 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 15:42:38 ] F#からポロロッカしてきました fold/undold、flip とかを使った関数合成がすげえ苦手なんですが このあたりに特化した書籍とかってないでしょうか モナドとか継続とかはわりとどうでもいいんですが
921 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 16:19:34 ] プログラムの変形やそこで使う公式を見るのがいいと思う。 birdがそういうの得意な人だから、 Introduction to Functional Programming using Haskell www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/ "Using Haskell"じゃない前の版の方がその辺は内容が濃かった。 The Algebra of Programming www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/ は関数合成、変形ドリルみたいな内容だった。 たしかparserを必要な機能を持つように変形する論文もあったはず。
922 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:06:40 ] undoldって何かと思ったけど、unfoldの間違いだよね?
923 名前:920 mailto:sage [2008/12/14(日) 17:19:51 ] 間違いですw >>921 ありがとう Introduction〜とRealWorldHaskellをぽちってみました 下は高杉…
924 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 17:13:13 ] yet another haskell tutorialの4.6で cfold' f z [] = z cfold' f z (x:xs) = f x z (\y -> cfold' f y xs) という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが 普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして 末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
925 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:48:15 ] 面倒だからfactorialで書くと、 fac 0 = 1 fac n = n * fac (n-1) なのか fac n = fac (n-1) * n なのかってことだから、 fac n = ((n *) . fac) (n-1)あるいは、 fac n = ((* n) . fac) (n-1) fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、 fac n = (((\m ->(* m)) n) . fac) (n-1) fac0 f n = ((f n) . (fac0 f)) (n-1)で fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n \m ->(m *)と\m ->(* m)は、 fac(n-1)を計算した後にすべき計算、つまり継続になっています。
926 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:51:01 ] 要するにfoldってのは累積を計算しているのだから、 その累積演算を関数に独立させると、foldの性質上、継続的になるのです。 mapだとこうはなりません。
927 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:40:24 ] >>926 ところがどっこい、この説明のすぐ後で、 「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。 それを考えると、foldlの定義からcfold'へ持っていってあげたほうが 親切かもしれません。
928 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:53:36 ] あっと、「この説明」ってのは 「yet another haskell tutorial の cfold' の説明」のことね。
929 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:38:03 ] >>927 cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、 mapでは引数に渡す演算ではなくて、:が継続的になるわけです。 だからYAHTでは微妙に表現を変えています。 map f = foldr (\x -> ((f x) :)) [] ですから当たり前ですけども。
930 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 19:38:36 ] >>929 すまん、「継続的」という言葉の意味がさっぱり分からん。 CPSにしたときに最後に行われる計算、という意味なら、 foldlは「foldl」自体が継続的、 foldrは引数として渡す関数「f」が継続的ということになるので、 fold*で継続的となる関数が同じになるとは思えない。
931 名前:デフォルトの名無しさん [2008/12/21(日) 19:58:16 ] おそらく激しいFAQだとは思うのですが、日本語の扱いについて。 Charの仕様からして、 >>5 の「i. CharをUnicodeとして扱う」が筋と思いますが、 リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。 blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、 メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。 Haskell'でも使えるのがいいですが…。
932 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:14:48 ] utf8-stringっぽいかな‥‥