1 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:13 ] haskell.org www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.shido.info/hs/ 過去ログ 関数型プログラミング言語Haskell Part1 pc.2ch.net/tech/kako/996/996131288.html Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/ Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/ Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/ Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/ Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/ Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
448 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 19:16:16 ] たかだか有限時間で終わる処理について実行効率など考える必要はない
449 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 19:17:04 ] 神様キター!
450 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 21:31:07 ] >>448 人間が不快に感じるかどうかなんて些細な問題だよな
451 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:19:48 ] だったら数学やっててくれ。
452 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:05:36 ] >>448 512ビットの素因数分解だって有限時間でできますよ。
453 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 03:21:02 ] >>448 お前の人生も有限時間で終わるぜ
454 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 10:02:31 ] この宇宙は有限時間で終わりますか?
455 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:40:07 ] どなたか State モナドの使い方を 教えて貰えませんか?
456 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:58:23 ] 使いどころが知りたいのか書きかたが知りたいのか
457 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:20:13 ] >>455 例が腐るほどWEB上にあるだろ 検索してみろよ
458 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:22:47 ] 使いどころです。
459 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:34:18 ] >>458 入門書に載ってた例だけど、 ・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。 ただし同じ文字列は同じ整数に対応させること。例えば、
460 名前:459 mailto:sage [2008/01/19(土) 19:40:19 ] 途中送信御免 例えば、 (("hoge") "hage" (("fuga") "hage" ("fuga"))) という木なら ((0) 1 ((2) 1 (2))) にする。 手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、 Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。
461 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:49:50 ] 広範囲で変数を持ちまわるのに 普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、 そんなどこで変更されるかわからないようなアブナイことしなくても (a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、 普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?
462 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 08:17:57 ] >>461 「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。 だから混乱するんだと思うが。
463 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:37:59 ] >>460 禿言うなヽ(`Д´)ノ
464 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:55:16 ] >>460 hageにも人権をヽ(`Д´)ノ
465 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 10:36:58 ] (("nukege") "usuge" (("fuga") "usuge" ("fuga")))
466 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:17:31 ] オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、 いったいどういうデータ構造にするのが一番効率がいいのかね 2次元リストとか、Mapとか、いろいろあると思うが・・・
467 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:44:00 ] >>466 よく使われるのは1次元配列とbit board
468 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 12:50:26 ] ByteStringでのParsec実装が欲しいっす。
469 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:11:50 ] そういえばParsecがどうやって実装されてるか知らない ソース見てみたけど何か難しそうだ
470 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:03:19 ] 普通にモナドじゃないの?
471 名前:デフォルトの名無しさん [2008/01/29(火) 13:51:05 ] log4*的なロガーライブラリってないでしょうか?
472 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:58:35 ] >>471 実際に使ったことはないけど つttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Interfaces
473 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:11:30 ] >>472 おお!ありがとうございます。 試してみます
474 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:37:30 ] 質問です。 C言語で int hoge(void) { int x,i; for(x=0, i=0; i<100000; i++) { x=x+i; } return x; } をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。 他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。
475 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:03:59 ] まるで最低一種類は自力で書けるかのような言い方だな
476 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:09:44 ] どんな場合にも一番いい方法が存在するかのような言い方だな
477 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:16:33 ] >>474 俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる その例なら迷わずsum [0..100000]だな
478 名前:474 mailto:sage [2008/01/30(水) 16:19:09 ] >>477 ありがとうございます。 その場合、リストはどのように処理されるのでしょう? つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、 sum関数が終了するまでメモリに記憶されているのでしょうか?
479 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:29:10 ] >>478 どこからも参照されていないから、いつでもGCされうる状態 実際にメモリ上に残っているかどうかはGCのタイミング次第
480 名前:474 mailto:sage [2008/01/30(水) 16:34:17 ] >>479 ありがとうございます。 では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか? 足す直前に生成されるのでしょうか?
481 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:50:17 ] >>480 > 1001番目の要素 とはどういうものを意識してる?具体的にkwsk
482 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:52:05 ] >>480 処理系と最適化オプションに依る 素朴な遅延評価だと前者 sum [0..100000] ==> foldl (+) 0 [0..100000] ==> foldl (+) 0 (0:[0+1..100000]) ==> foldl (+) (0+0) [0+1..100000] ==> foldl (+) (0+0) (1:[1+1..100000]) ==> foldl (+) (0+0+1) [1+1..100000] … ==> foldl (+) (0+0+1+2+...+100000) [] ==> 0+0+1+2+...+100000 … だけど、例えばghc-6.8.2で-O2だと、Integer用に特殊化されたsumの実装が使われて、 foldlの蓄積引数が積極評価されるので後者になる
483 名前:482 mailto:sage [2008/01/30(水) 17:08:24 ] 分りにくい気がしたので補足 どっちの評価順でも、リスト生成は遅延される ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない GHCの最適化は足し算を遅延させないようにするもの
484 名前:474 mailto:sage [2008/01/30(水) 17:08:53 ] >>482 ありがとうございます。 とても参考になりました。
485 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:56:59 ] イータ簡約って奴でしょ。 www.lambda-bound.com/book/lambdacalc/node21.html
486 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:22:54 ] 質問です。 sourceforge.net/project/showfiles.php?group_id=168626 で6.8.1用のwxHaskellをダウンロードしてインストールし、 Windows XPでwxHaskellのサンプル(Minimal.hs)を ghc --make Minimal.hs としてコンパイルしてみたのですが、 出来上がったMinimal.exeをエクスプローラからダブルクリックで実行すると 目的のウインドウとコマンドプロンプトのウインドウの両方が表示されてしまいます。 コマンドプロンプトのウインドウはとても邪魔なのですが、 これが表示しないようにするにはどうすればよいのでしょうか? さらに、実行ファイルを配布する際にDLLを付属するのは格好が悪いので、 DLLを使わないコンパイル方法はないものでしょうか?
487 名前:486 mailto:sage [2008/01/30(水) 18:29:59 ] 前者の問題は過去スレを検索して解決できました。 コンパイルオプションに-optl-mwindowsをつければよいのですね。 早とちりしてすみません。 後者の方はまだ解決していません。
488 名前:486 mailto:sage [2008/01/30(水) 19:01:48 ] ファイルがめちゃくちゃでかくなると思っていろいろ調べたのですが、 e.tir.jp/wiliki?hdn > よく読んだら、「余分なデータの削除なるオプションで500KB弱になった」と書いてある。それらしいオプションは…… > > --overlay=strip strip any extra data attached to the file [DANGEROUS] > > なんか、「DANGEROUS」って書いてあるんだが。 とありますが、ghc6.8.1ではそのオプションは削除されています。 e.tir.jp/wiliki?hdn > stripと言えば、binutils付属のstripコマンドもあった。 > ... > strip -s hsddd01.exe > 2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。 この方法はマニュアルの www.haskell.org/ghc/docs/latest/html/users_guide/smaller.html に言及されていました。 -funfolding-use-threshold0 というオプションをMinimal.hsのコンパイル時につけると逆に若干ファイルサイズが増えました。
489 名前:デフォルトの名無しさん [2008/01/31(木) 12:20:45 ] GHC6.8.2(Win)でbytestring-0.9.0.4をつかって -profフラグ付でコンパイルしようとすると Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4? と出て失敗してしまいます。(profフラグをつけなければ成功します) 対処方ご存知の方いらっしゃいますか? つか、ByteStringに変更してさらに遅くなった俺涙目
490 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 17:57:26 ] >>488 その--overlay=stripはupxのオプションだろ >>489 そのbytestringパッケージはどうやってインストールした? cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない
491 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 02:37:31 ] 質問です。 windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか? ロックがかかったままのファイルに書き込みする必要があるのです。
492 名前:489 mailto:sage [2008/02/01(金) 12:44:40 ] >>490 なるほど、ありがとうございます。 -p付でインストールしなおしてみます。
493 名前:デフォルトの名無しさん [2008/02/03(日) 17:41:55 ] % cat hello.hs main = putStrLn "こんにちは、世界!" % ghc hello.hs -o hello % ./hello ...... ←[ここは文字化け] UTF-8でソースを書いて、コンパイル&実行したのですが、 文字化けします。 ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、 UTF-8は使えないのでしょうか? コンパイルオプションが必要ですか?
494 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:05:27 ] >>493 >>5-6 参照
495 名前:492 mailto:sage [2008/02/03(日) 18:44:28 ] >>493 どうもありがとうございます。 調べてみます。
496 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:46:49 ] >>469 ふつケルの終わりのほうに超簡易Parsec実装の解説がある。
497 名前:デフォルトの名無しさん [2008/02/05(火) 12:00:00 ] do記法がどのように(>>=)変換されているのかがよくわからないです。 たとえば do { a <- return 1; Just 2 } は return 1 >>= (\a -> Just2) なのはぎりぎりわかったような感じですが 3つ以上 do { a <- return 1; Just 2; return a } だとどうなるのでしょうか?
498 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:13:23 ] 仕様を読めれば仕様を読むのが一番早い
499 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:29:01 ] >>497 最初の一つだけ変換する return 1 >>= (\a -> do Just 2; return a) 残ったdoも同じ規則で変換すれば良い。最終的には、 return 1 >>= \a -> Just 2 >> return a
500 名前:497 mailto:sage [2008/02/05(火) 12:31:43 ] >>499 なるほど!ありがとうございます!
501 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:33:19 ] >>500 do { a <- return 1 ; Just 2 } って書くとemacsで見た目きれいにレイアウトできる。 >>=を使った場合、 return 1 >>= \a -> Just 2 って書くときれいにレイアウトできる。 単に見た目の話だけど^^;;
502 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:28:19 ] Haskell でも型のキャスト出来るんかね リファレンス見てたらそれっぽいのが・・・。
503 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:31:47 ] >>502 (1::Int32)
504 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 11:53:24 ] >>503 キャスト自体は無いから、いちいち関数を使う 数値型の変換ならfromIntegralとかfloorとか ポインタの変換ならcastPtr ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast >>503 の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない
505 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:20:26 ] ダウンキャストに相当するのがあるのか。
506 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 20:12:04 ] unsafeCoerceはどうよ?
507 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 20:26:50 ] >>506 忘れてた 変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが unsafeCoerce :: a -> b Data.Typeableのキャストはこれをラップして安全にしたもの
508 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 14:13:19 ] ふつうのHaskell読み終えて、WikiBookとか眺めてるんですけど、ある程度まとまった Haskellプログラムの実例が載ってる本というと、Craftになりますか? ちょっと高価な本なので、買おうか迷ってます。
509 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:35:27 ] >>94-96 research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm 4.4 Declaration style vs expression style
510 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:30:20 ] Kleisliってなんて読むの?
511 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:31:04 ] クライスリーじゃないの?
512 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:33:20 ] >>510 クレイスリ
513 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:04:55 ] クレイスリ に一致するページは見つかりませんでした。
514 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:32:57 ] クライスリーだって該当する記述が2chしかないじゃないかよ。
515 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:35:58 ] とりあえずドイツ語っぽい綴りを ドイツ語の規則に従って読んでる点で クライスリーの方が信憑性はある
516 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:39:36 ] TeXをテックと読むのはおかしいですか Linuxをライナックスと読むのはおかしいですか
517 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:43:06 ] おかしい
518 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:44:15 ] ↑でもそういう風に読んでる人結構いるよ
519 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:45:10 ] 大団円を大円団と勘違いしている人は それはそれで正しいと申すか
520 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:46:27 ] 俺、小さいころミートボールとゲートボールの違いが分からなかった
521 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:47:54 ] >>516 これは米語読みだから、 金日正を「きんにっせい」と読むようなもの。 特に問題ない。
522 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:48:09 ] 英語っぽっくウィヌックスで
523 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:34:53 ] クライスリーでおk?
524 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:43:55 ] 別に何でもOK
525 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:44:19 ] 数学板で聞いてみたら?
526 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:15:00 ] エルアイエヌユーエックスって読んでた・・・
527 名前:デフォルトの名無しさん [2008/02/15(金) 22:28:35 ] dev.ariel-networks.com/Members/mizyo/haskell306e30b930ec30c330b730b930c630e03068stm306b306430443066-305d306e3 頭の悪いHaskell厨増殖しすぎwwwwwwww
528 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:55:10 ] >>527 Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw
529 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:01:38 ] ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02 www.nicovideo.jp/watch/sm2336941 伊藤静「じゃあ、次もwww」 後藤邑子「斬ったほうがいい?www」 伊藤「次は斬る?www」 後藤「どうするww」 伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」 後藤「.........ウザい」 二人「キャッハハハハハwwwww」 伊藤「ちょほんとさあ、大丈夫?www」 後藤「おい天使、おいおい自称天使ww」 伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」 後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」 伊藤「それかもう日本出て行ったらいいんじゃないの?www」 後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」 伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」 後藤「コワイヨーwwwコワイヨーwwwww」 二人「クックックックwwww」
530 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:51:50 ] Haskellのようなピュアな言語じゃ薄汚れた現実世界のアプリは書けないと言いたいのか?
531 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:06:05 ] >>530 ffiが実装された時点でピュアじゃねーよ。 これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。
532 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:16:09 ] 別にffiも変なことしなけりゃ純粋さを壊さないだろ
533 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:28:40 ] >>532 おっと、そんなこと言っちゃうのか? 純粋でない例が一つでもあれば、それは純粋じゃないんだよ。
534 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:39:56 ] まあそうだ でも一々「ほぼ純粋な関数型言語」とか言うのか?
535 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:48:31 ] いや、ただの関数型言語だよ。 純粋なんて言葉をつけるのはおこがましい。
536 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:52:23 ] いや、でも滅多に副作用を使わないのは事実だし、重要な特徴じゃん
537 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:57:12 ] 「モナディックI/Oを採用した関数型言語」でいいんじゃね
538 名前:デフォルトの名無しさん [2008/02/19(火) 08:11:48 ] HaskellによるHaskellのための開発環境Leksah 0.1 ttp://builder.japan.zdnet.com/news/story/0,3800079086,20367512,00.htm
539 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:08:19 ] 副作用無しでなんでもできれば純粋ってことでいいんじゃね。 SchemeやMLは副作用無しじゃI/Oができないし。
540 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:44:17 ] また公式落ちてるぞ よく落ちる糞公式だな
541 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:11:23 ] LuaってHaskell系だったのか pc11.2ch.net/test/read.cgi/dtm/1194648279/216
542 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:29:53 ] そのスレで既に十分突っ込まれてるじゃないか
543 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:42:17 ] haskellのプログラムは巨大化する傾向があるようですが、 Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?
544 名前:543 mailto:sage [2008/02/21(木) 22:43:03 ] すみません、言葉足らずでした。 haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。
545 名前:543 mailto:sage [2008/02/22(金) 20:08:04 ] とりあえず1/10ぐらいのサイズにしたいのです。
546 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:22:26 ] Cだって大きなプログラム作れば大きいだろ。
547 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:29:57 ] とりあえず ・GHCの最新版を使う ・最適化オプションを有効にする ・strip くらいじゃないか? あとUPXとかで圧縮するのが有効というのを読んだ
548 名前:543 mailto:sage [2008/02/22(金) 22:16:46 ] >>546 論外