関数型プログラミング言語Haskell Part14at TECH
関数型プログラミング言語Haskell Part14 - 暇つぶし2ch2:デフォルトの名無しさん
11/03/06 13:36:32.17
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 URLリンク(www.amazon.co.jp)
・Haskell: The Craft of Functional Programming
 URLリンク(www.amazon.co.jp)
・The Fun of Programming
 URLリンク(www.amazon.co.jp)
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 URLリンク(www.amazon.co.jp)
・入門Haskell
 URLリンク(www.amazon.co.jp)
・ふつうのHaskellプログラミング
 URLリンク(item.rakuten.co.jp)
・Programming in Haskell
 URLリンク(www.amazon.co.jp)
・Real World Haskell
 URLリンク(www.amazon.co.jp)
・関数プログラミングの楽しみ
 URLリンク(www.amazon.co.jp)

3:デフォルトの名無しさん
11/03/06 14:00:18.76
関連リンク
 
・GHC Wiki
 URLリンク(hackage.haskell.org)

・A History of Haskell
 URLリンク(research.microsoft.com)

・関数型関連の用語集
 URLリンク(sky.zero.ad.jp)

・本物のプログラマはHaskellを使う
 URLリンク(itpro.nikkeibp.co.jp)


こんなもんでどうでしょう

4:デフォルトの名無しさん
11/03/06 14:07:15.39
乙です。

ちょろっと追加

ふーぐる
Haskell API search Engine
URLリンク(www.haskell.org)

簡単な使い方

1.検索バーに関数名を入れて検索
 例 map

2.検索バーに型名を入れて検索
 例 (a -> b) -> [a] -> [b]

5:デフォルトの名無しさん
11/03/06 14:16:11.35
おぉ、大事なものを忘れてた、ありがと

ところで Hoogle と Hayoo って機能的には同等?
俺は Hoogle の方が発音しやすいから、ずっとこっちを使ってるが

というか、人に勧めるのに「ひゃゆぅ~」って言うの恥ずかしい

6:デフォルトの名無しさん
11/03/06 14:39:20.38
Hayooは初めて知りますた
Hoogle:公式、最新データ
Hayoo:Holumbusプロジェクトの一部で、検索結果に使用例も出る
みたいな感じ?
使ってる人いれば適当にフォローお願いします

7:デフォルトの名無しさん
11/03/06 15:00:41.77
>>1,4 乙です。


8:デフォルトの名無しさん
11/03/06 15:47:55.87
では諸君、議論をレジュームしたまえ

9:デフォルトの名無しさん
11/03/06 15:50:15.35
なんかもう、どーでもよくなってきた

10:デフォルトの名無しさん
11/03/06 19:40:40.85
あ、じゃあ
最近気になったので聞いてみる

Haskellって人工知能との相性はどうなんだろ


11:デフォルトの名無しさん
11/03/06 19:44:10.99
そういうのは言語に依らないと思うのだが

12:デフォルトの名無しさん
11/03/06 20:06:27.56
Haskell との相性というよりは、宣言型言語との相性は良さそうだ
ACM にもその手の論文が結構ある

Haskell Wiki にも記事があって、色んな人が研究してることが分る
URLリンク(www.haskell.org)

それほど興味が無いから答えになってなくて悪いが

13:デフォルトの名無しさん
11/03/06 20:55:02.42
>>10
論文を書きやすいという意味で、Haskellと人工知能の相性はすこぶる良い

14:デフォルトの名無しさん
11/03/06 21:15:40.28
>>11
C言語でAIとかの本も出てたし、本質的にはそうなんだろうけど、人工知能と言えばPrologってイメージが有るじゃ無いですか

>>12-13

ありがとです

何か、詰碁を解くのに向いてるとか聞いたんで、ひょっとして?と思ったんですよね


15:デフォルトの名無しさん
11/03/06 22:40:42.53
>>14
> 何か、詰碁を解くのに向いてるとか聞いたんで

これですよね
URLリンク(www.shido.info)
URLリンク(www.shido.info)

AI のアプローチがどのようなものか知りませんが、
この詰碁を解くプログラムは経路探索ですね

おそらく将棋や碁、オセロなんかの終盤における「読み切り」と同じかと

16:デフォルトの名無しさん
11/03/07 21:20:47.98
数値計算のプログラムを作るのが難しいプログラミング言語は、AIに向いているといっておけば間違いない

17:デフォルトの名無しさん
11/03/08 01:30:35.02
解候補の集合の生成と探索の制御が楽なのでAIに向いていると言えなくもない
ぶっちゃけ可変配列の書式が楽な言語は全部AIに向いている


18:デフォルトの名無しさん
11/03/09 15:04:56.44
sampou.orgにあるContinuationモナドのcallCC関数の定義
callCC f = Cont $ \k -> runCont (f (\a -> Cont $ \_ -> k a)) k
これの最後のkって必ず評価されないと思うんだけど合ってるのかな

19:デフォルトの名無しさん
11/03/09 17:34:40.08
そのkってモナドに入ってくる前のcontinuationでしょ?
じゃ最初に評価されるんでないの?

20:デフォルトの名無しさん
11/03/09 18:13:08.53
ごめん、評価の問題じゃないね
runCont (f (\a -> Cont $ \_ -> k a))に適用する方のkはCont $ \_ -> k aで捨てられてるから、
それならundefinedに置き換えても問題なく動くんじゃないの、と

21:デフォルトの名無しさん
11/03/09 18:21:08.24
あ、callCC $ \exit -> ...でexit呼ばれなかった時の為か

22:デフォルトの名無しさん
11/03/09 20:01:07.13
URLリンク(shootout.alioth.debian.org)
久しぶりに見たら、Haskell、4つのAllのベンチで
どれもCの3倍以内の速度が出てて、
全てOCamlよりも速いんだけど何が起こったの?

23:デフォルトの名無しさん
11/03/09 22:14:09.80
>>2
新しい仲間が発売されるらしい。

Learn You a Haskell for Great Good: A Guide for Beginners
URLリンク(www.amazon.co.jp)

webで見られるんだっけ

24:デフォルトの名無しさん
11/03/11 11:53:44.71
URLリンク(haskell.1045720.n5.nabble.com)

25:デフォルトの名無しさん
11/03/11 22:21:16.22
URLリンク(hackage.haskell.org)

なにこの日本人好みなデザイン。俺得。

26:デフォルトの名無しさん
11/03/12 00:31:28.41
Haskell Platform がリリースされたと思ったら大地が揺れたでござる

27:デフォルトの名無しさん
11/03/12 01:52:03.93
停電でインストール出来ない・・・

28:デフォルトの名無しさん
11/03/12 01:57:31.06
>>27
ネットに繋げられるならいつでもハスケれるよ!

URLリンク(tryhaskell.org)

明日は冷えるらしいから暖かくして風邪引かない様にね

29:デフォルトの名無しさん
11/03/12 18:49:15.12
>>26
-fglasgow-extsを拒否するようになって、大地の神さまが激怒されただよ

30:デフォルトの名無しさん
11/03/13 12:06:26.48
諸君、祈祷したまえ

31:479
11/03/13 13:55:50.34
>>26,29,30
思わず震災さえもネタにしてしまうのは、
普段から抽象的な思考に努めているHaskeller特有の発想なのだろうか?
それとも自分達は一般人には手の届かない特別なプログラミングをしているという、
潜在的な選民意識の現れなのだろうか?

関西大震災発生直後の現地取材で
「まるで温泉街のようだ」とコメントした某TBSの故アナウンサを憶い出す。
関西大震災で知人が被災した経験のある自分には、
そんなHaskellerの感性が理解できない、理解したくない。

32:デフォルトの名無しさん
11/03/13 14:14:22.07
つまらないネタとそれに噛みつく奴は
全部同一人物だと思っている

33:デフォルトの名無しさん
11/03/13 14:18:55.98
そういうことにだけは熱心な人たちねw

34:デフォルトの名無しさん
11/03/13 14:30:14.25
不謹慎=俺が哀しんでるんだからおまえも哀しめ、空気読め

35:デフォルトの名無しさん
11/03/13 14:39:15.12
Haskell Platform 2011.2.0.0(Windows 7)をインストールしたんだが、
ここにパッケージ gtk(gtk2hs)がインストールできない
(パッケージ gtk2hs-buildtools はインストール済み)

cabal gtk と実行すると、cairo のビルドが完了して Registering cairo-0.12.0... の段階で
「setup.exe: internal error: unexpected package db stack: [UserPackageDB]」となる

それでもインストール処理が続く
次に glib のビルドも完了して Registering glib-0.12.0... の段階でまたもや
「setup.exe: internal error: unexpected package db stack: [UserPackageDB]」となる

その後、cabal: Error: some packages failed to install: となり、
cairo と glib で例外が発生して、インストールが未完で終了した

パッケージの説明を見る限りは、ghc 7.0 でも問題ないそうだが、
なにか処理が足らないのだろうか


Haskell Platform 2010.2.0.0 では次の作業手順で gtk がインストールできてたから
全く同じ手順でインストールしてみたのだが

1. URLリンク(www.gtk.org) で gtk の All-in-one bundles の 2.16 をダウンロードし、
"c:\" 下に展開し、bin ディレクトリへのパスを環境変数に追加する

2. Haskell Platform フォルダ内の mingw\bin ディレクトリへのパスも環境変数に追加する

3. cabal install gtk2hs-buildtools を実行してから cabal install gtk を実行する

36:Perl忍者 ◆M5ZWRnXOj6
11/03/14 19:21:49.11
最強ハッカーチームPerlBlack「黒真珠」
スレリンク(linux板)


37:デフォルトの名無しさん
11/03/15 14:58:12.81
数学的なやつじゃなくてモナドがどのようにコンピューター科学にどう応用されているかみたいな
詳しい本おしえてください。

38:デフォルトの名無しさん
11/03/15 15:15:07.85
モナドをコンピュータ科学に利用しているというより、
命令文の実行順を基礎数学だけを用いて表現したモデルがモナド

命令文の順序付き重複集合をモナドで表現したことで、新たに何かが生まれたという話は聞かない

ただ、モナドで表現できたことで論文を大量生産できた

39:デフォルトの名無しさん
11/03/15 17:06:18.34
とりあえずこれは見た?
URLリンク(www.sampou.org)

40:デフォルトの名無しさん
11/03/15 17:47:03.19
Moggi91の例では集合の圏を使って例外付き計算、副作用を持つ計算を抽象化してるな
で、そこにモナドがあってその性質はうんたらかんたらとかそういう内容
モナドを使えば典型的な計算を綺麗に構成できるって事はまぁそれなりに嬉しい事なんじゃないのかな

41:デフォルトの名無しさん
11/03/16 01:00:52.45
モナード

42:デフォルトの名無しさん
11/03/16 13:08:25.76
>>39
アーカイブがダウソロードできないのだが(藁

43:デフォルトの名無しさん
11/03/16 18:43:10.89
オンラインで見れるからいいじゃないか

44:デフォルトの名無しさん
11/03/17 01:33:16.11
>>43
ネットがナローバンドだから…


45:デフォルトの名無しさん
11/03/17 17:07:24.74
>>42 nobsun になんとかして、って伝えたら直ると思う

46:デフォルトの名無しさん
11/03/20 17:41:09.18
自分でputCharとかのような出力関数を定義するのってどうするんだ?

よそのGUIライブラリのDLLをHaskellで使いたいんだけど、IOが遅延されてこまってる。
createWindowみたいなIO()の関数があっても、
これを出力と認識してないみたいで最後まで実行されないんだ。

47:デフォルトの名無しさん
11/03/20 19:57:53.60
遅延させるってのは勘違いで、問題は別にあるんじゃね?
HaskellはIO動作を勝手に遅延したりしないよ

48:デフォルトの名無しさん
11/03/20 21:09:20.42
あ、そのとおりだった。
IO(a->b)の(a->b)の副作用のある関数が返ってきてて、その関数を実行してないのが問題だったっぽい。
thx

49:デフォルトの名無しさん
11/03/21 07:41:51.33
>>48
> IO(a->b)の(a->b)の副作用のある関数が返ってきてて

それなら、IO (a -> IO b) であるべきなんじゃ…

50:デフォルトの名無しさん
11/03/21 11:12:08.27
>>49 ぬぬ、たしかにそうかも。

というかVisualC++で作ったDLLの引数がある関数を呼んだら
Segmentation fault/access violation in generated code
って怒られた。runghcなら通るのに、コンパイルして実行するときだけ……。

51:49
11/03/22 05:57:11.86
>>50
どうつまづいているのかよく分からんが、FunPtr や ForeignPtr を使わないといけないのかもしれん。

このへん↓に解説がある:
URLリンク(www.haskell.org)


52:デフォルトの名無しさん
11/03/22 21:49:40.52
わざわざサンクス。
原因はDLLの関数をHaskellで定義するときに、stdcallにしてたのが原因だった。
ccallにしないと駄目なのね。基準がわからんぜ。
とりあえずDirectXの関数をDLLにエクスポートしてライフゲーム実装するところまではできたから、
あとは何とかなりそう。
猛者たちのスレを汚してすまんね。

53:デフォルトの名無しさん
11/03/22 23:12:20.26
network-2.3.0.2 の setSocketOption で RecvTimeOut が設定できません
適当なソケットに
setSocketOption sock RecvTimeOut 1
とすると以下の例外が出ます
*** Exception: setSocketOption: invalid argument (Invalid argument)

ソースを見てみると setSocketOption は ffi で setsockopt を呼んでいるように見えました
setsockopt でタイムアウトを設定する場合は、struct timeval で秒数を指定してポインタを渡す必要があります
しかし、setSocketOption では Int で秒数を指定してポインタを渡しているようでした

エラーの原因は、上記で正しいですか?ffi は初めてなのでほとんど理解できませんでした。
もしそうだとすれば、このバグを報告するとしたらどこが正しいですか?
Maintainer に直接メールするのが正しいですか?バグ登録をする専用のページなどがありますか?

54:デフォルトの名無しさん
11/03/23 09:06:17.27
一応 trac に似たような問題
URLリンク(trac.haskell.org)
があがってるから、認識はされていると思うけど、早く対応してもらいたければ
github の issue にあげるのがいいんじゃない?
URLリンク(github.com)

55:デフォルトの名無しさん
11/03/24 08:38:54.64
東京のハスケラーは水道水飲んでる?

56:デフォルトの名無しさん
11/03/24 08:58:34.93
飲んでるけど評価遅延させてるから大丈夫

57:デフォルトの名無しさん
11/03/24 11:47:03.64
評価しなければ一生大丈夫ってことだな

58:デフォルトの名無しさん
11/03/24 12:23:32.95
東京だが、普段から浄水器で浄化した水飲んでるから問題なし。
だいたい基準値の3倍程度の放射能なら一生飲み続けても高々0.07%ガン発生率がアップするだけだし、
浄水器使ってればさらに下がるでしょ。
気にしてる奴の方がストレスが原因で禿げるか死ぬかするw

59:デフォルトの名無しさん
11/03/24 12:35:36.01
>>56
数年後、忘れた頃にインフルエンザとかで病院行って尿検査したら、
溜まった分が一気に評価されるぞ

60:デフォルトの名無しさん
11/03/24 12:50:13.13
そこで>>56は急性放射線症であぼ~んw

61:デフォルトの名無しさん
11/03/24 12:50:36.16
>>58
どこでそんなデマを…

62:デフォルトの名無しさん
11/03/24 16:26:50.33
>>58
浄水器に放射性物質が溜まったら楽しそうね。

63:デフォルトの名無しさん
11/03/24 16:45:56.61
0.07%って宝くじで1億円あたる確率より高いよね

64:デフォルトの名無しさん
11/03/24 16:49:21.56
>>63
人間死ぬまでに50%の確率で発がんするんだってさ。
50.07%に発がん率がアップしたとして気にするの?

65:デフォルトの名無しさん
11/03/24 17:05:48.54
50%ってwwww
1人の母集合を対象に癌になるかならないかというのは確率じゃねーよwww


66:デフォルトの名無しさん
11/03/24 17:11:58.50
>>65
一人?
いや、複数だが。

67:デフォルトの名無しさん
11/03/24 20:44:46.18
1人でしょうか。
いいえ、複数です。

だろ

68:デフォルトの名無しさん
11/03/25 00:15:26.04
浄水器に溜まるならOK。浄水器を抱いて寝るやつはいないんだから。

69:デフォルトの名無しさん
11/03/25 03:53:53.96
>>68
ろ過システムは、溜ったヤツがたまにポロって取れて流れてくるから



70:デフォルトの名無しさん
11/03/25 07:20:10.39
Haskellの話をしなさい

71:デフォルトの名無しさん
11/03/25 07:36:47.61
>>70
遅延評価は、溜ったヤツがたまにポロって取れて流れてくるから

72:デフォルトの名無しさん
11/03/25 08:22:56.12
硫黄で腐食した藻などが混入する場合が有りますが副作用はありませんので
どうかご安心ください


73:デフォルトの名無しさん
11/03/25 12:42:45.60
こんな Haskell 本あったら読みたい
こんな Haskell 関係の記事があったら読みたい

ってのは何かある?

俺は Arrow を実際のアプリ製作でどう使うのかとか、
あのライブラリではこういう目的でこう使ってる、
みたい解説がある本が読みたい

74:デフォルトの名無しさん
11/03/25 13:12:12.43
ところでお前ら、このgif動画は時計回りにみえる?反時計回りに見える?
URLリンク(twitpic.com)

75:デフォルトの名無しさん
11/03/25 13:25:48.04
>>74
はじめは反時計回りにみえた。
たぶん、時計回りに見えるのが正しいだろうから(理由は省略)、オレの能力には小さな問題があるんだろう。

76:デフォルトの名無しさん
11/03/25 13:51:12.49
俺は時計回りにしか見えない、ヤバい

77:デフォルトの名無しさん
11/03/25 13:54:33.47
まあ地震関連のデマよりは害が少ないかな

78:デフォルトの名無しさん
11/03/25 14:03:04.25
反時計回りに見えるようになった

79:デフォルトの名無しさん
11/03/25 14:59:46.19
はじめは時計回りにしか見えなかった。
これで、反時計回りに見えるって、どんな理屈なんだろうと、
画像の差を意識してたら、乳首に気がついて、
乳首が見えるってことは、ブラしてないんだろ?
なんで、揺れないんだ?って不思議に思いながら乳首を見つめていたら、
今度は、反時計回りにしか見えなくなっちゃった。


80:デフォルトの名無しさん
11/03/25 17:16:02.72
これいつのネタだよ

81:デフォルトの名無しさん
11/03/25 17:20:07.94
haskellでこういう動画作れないですか

82:デフォルトの名無しさん
11/03/25 19:23:12.78
作れる

83:デフォルトの名無しさん
11/03/25 19:56:14.72
>>74
時計回り・反時計回りどっちもできるようになった!

84:デフォルトの名無しさん
11/03/29 11:37:35.60
時計周りにしか見えん…

85:デフォルトの名無しさん
11/03/31 17:46:27.57
QuasiQuotesを使って新しい文法を導入したい。
Haskellのリテラルとか式とかdoの中の文とかは既存の文法を基本的に使って、そこに少しだけ新しい文法を入れたい。
そのためには、基本的な構文要素の出来合いのパーサーがあって、それをパーサーコンビネータで組み合わせて使用できればうれしい。

で、探してみると、haskell-src-extsライブラリというのはあったけど、繰り返しとか、選言とかのコンビネータはないよね。
どうすればいい?

haskell-src-extsの上にどうにかしてコンビネータを自分で実装する?
あるいは、基本的なリテラルとかの構文要素もParsecとかでパーサーを作ったほうが早い?
それとも、haskell-src-exts + Parsec みたいなテクニックが存在する?

86:デフォルトの名無しさん
11/04/04 10:31:55.61
諸君、議論したまえ

87:デフォルトの名無しさん
11/04/04 18:47:50.79
gaeでhaskell使えた

88:デフォルトの名無しさん
11/04/05 00:35:16.51
>>87gae て google の?

89:デフォルトの名無しさん
11/04/05 16:57:08.58
GUIライブラリは何が良さそうですかね?

90:デフォルトの名無しさん
11/04/05 17:57:20.40
>>89
Windowsで動けば良いなら、面倒くさいけど、Win32APIバインディングを直接たたくのが無難。

LinuxではGTKを以前Cで使い込んだことがあるから、Gtk2Hsを試したことがあるけど、最新版のGHCに対応してない時期があって使わなくなった。
もっとも、その後動きがあって、その状況は改善されている、たぶん。
面倒くさくてもよいならX11バインディングを使う道もある。
(他のUnix系も同様のはず)

クロスプラットフォームなら、WxHaskellが良く使われている印象だけど、オレはなじめなかった。
3DCGをやりたいならGLUTもある。

HaskellのGUIライブラリは基本的に他言語のライブラリのバインディングなので、選択基準としては、他の言語で使うときとほとんど同じになるだろう:
1. どのOSで動かしたいか
2. 何をしたいか。ダイアログが一つ表示できればそれでよいのか。統合開発環境みたいな複雑なGUIアプリケーションを作りたいのか。あるいはゲームか。
3. 使ったことがあるか。資料は豊富か(他言語向けの資料でも良い)。

91:デフォルトの名無しさん
11/04/05 18:27:44.29
haskellからWPFを叩きたい!

92:デフォルトの名無しさん
11/04/05 19:40:30.48
>>91
hs-dotnet (URLリンク(hackage.haskell.org))

これで .NET Framework を叩いてくれ
WPF ではなく普通にウィンドウと適当なボタンを表示して、
何か反応させることはできたが、俺はそこで力尽きた

.NET Framework が叩けるんだから当然 WPF も扱えると思うが、
それで「Haskell から直接叩けた」ことになるのかは知らん

93:デフォルトの名無しさん
11/04/05 20:35:43.71
西日本も福島原発の放射能に曝される。

4/7 予測 URLリンク(up3.viploader.net)
発表はドイツ気象庁 URLリンク(www.dwd.de)

94:35
11/04/06 19:57:54.79
>>35
解決したのでお知らせする

結論から言うと、恐らく gtk-0.12.0 パッケージの作者のミスだと思われるため、
下記の解決方法はバージョンアップで意味を成さなくなると思う(そうなって欲しい)

URLリンク(hackage.haskell.org)
このページに載っているとおり、パッケージの tar.gz ファイルを展開し、
中の Gtk2hsSetup.hs ファイルの内容を一部書き換えてから cabal install する

ただし、gtk-0.12.0 に依存し Gtk2hsSetup.hs を持つ全てのパッケージについて、
同様の方法で個別にインストールする必要がある、しかも依存関係の順に

Gtk2hsSetup.hs ファイルを修正すべきパッケージは以下の通り
・gio-0.12.0
・glib-0.12.0
・pango-0.12.0
・cairo-0.12.0
・gtk-0.12.0

他の依存パッケージは普通にネット越しにインストールすればいい

95:デフォルトの名無しさん
11/04/06 21:02:18.99
>>94
乙。こういう問題解決の報告って良いよね。

96:デフォルトの名無しさん
11/04/07 01:19:05.94
ghc7でqtHaskellをインストールするとエラーすんのでその解決方法。
ぐぐったら出てきたのだけど、StackOverflowの1件のみだったので日本語で書いておく。

build.plはghc7未対応だから諦めて手作業(Manual Installation参照)。

runhaskell Setup.hs buildするとQtc/Core/Attributes.hsが583行目でエラーするので583行目を下記のように書き換える。
reject' = (Qslot "reject()", \_ -> ())

97:デフォルトの名無しさん
11/04/10 03:54:27.20
getDirectoryContentsとか、getArgsとかにunicode混じってると化けてしまうのはどうにか出来ませんか?

98:97
11/04/10 03:57:40.00
追記:GHC7.0.2
標準入出力の方は問題なく動いています。

99:デフォルトの名無しさん
11/04/10 04:14:23.92
大儀であっ

100:デフォルトの名無しさん
11/04/10 04:30:37.86
utf8-string
System.Environment.UTF8
Codec.Binary.UTF8.String (decodeString)

101:デフォルトの名無しさん
11/04/10 11:34:59.70
>>97
OS環境のロケールと、コマンド引数、ファイル名の符号化が一致していないのではなくって?
そういうことをhaskellプログラム側でごちゃごちゃやるより(できないとは言わない)、OSのセットアップとか、作業パスを見直したほうが良いと思う。

102:Perl忍者lvl4 ◆M5ZWRnXOj6
11/04/10 13:48:13.06
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28


スレリンク(prog板)

>1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・

> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!

103:デフォルトの名無しさん
11/04/10 16:27:41.04
>>100
Codec.Binary.UTF8.StringのdecodeStringとencodeStringの2つで解決しました。
ありがとうございました。

>>101
恐らく>>100を前提に書いて下さったと思うのですが、そこにすら至ってませんでした。

104:g
11/04/11 00:29:18.93
utf8-stringのことは忘れてtextパッケージを使いましょうみたいなのを以前聞いたことがある

105:デフォルトの名無しさん
11/04/11 21:14:50.48
URLリンク(itpro.nikkeibp.co.jp)

毎回ネタが濃くて楽しみにしてるんだけど、更新日守ったのって1月だけだよね
早く次のネタこないかな

106:デフォルトの名無しさん
11/04/12 11:27:42.51
hackageを見ても説明が不十分だったり無かったりで、引数や戻り値、名前が抽象的過ぎて何をする関数なのかが分からなかったりする事が多々ある。
みんなどこ見て各パッケージの使い方覚えてるの?

107:デフォルトの名無しさん
11/04/12 11:54:15.10
よくわからないものはソースを見る

108:デフォルトの名無しさん
11/04/12 12:50:17.23
hackage に載ってる作者のサイトとか見る
ソースも見る

それで分からなかったら、基になってる論文などを漁ってみる

109:デフォルトの名無しさん
11/04/12 15:00:24.31
やはりそれしかないのか…
参考になりました。ありがとう。

110:デフォルトの名無しさん
11/04/13 16:59:33.20
諸君、議論をレジュームし給え

111:デフォルトの名無しさん
11/04/14 04:19:16.44
一々インストールしたパッケージのヘルプ作る為に
haddockするの面倒です
屡々エラーでるし

目的のパッケージが多数の他パッケージに依存していた場合なんて
発狂しそうです

112:デフォルトの名無しさん
11/04/14 07:28:39.50
cabal\config ファイル内にある "documentation : True" のコメントを外しておけ
そうすれば cabal install でドキュメントも自動的にインストールされる
(依存パッケージのドキュメントも全て自動でインストールされる)

インストール先も config ファイルで設定できる
デフォルトでは\doc フォルダ内
index.html や doc-index-*.html ファイルらも自動で融合してくれる

113:デフォルトの名無しさん
11/04/14 09:37:25.98
ネット繋がってないので
runghc Setup configureからやってるんです
キャバルって確か依存グラフ作って必要なのをダウンロードするんですよね
英語ドキュンメントに確かにhaddockを内部呼び出しするっぽい事書いてありましたが
いずれにせよキャバルは無理だと思います

114:デフォルトの名無しさん
11/04/14 12:42:22.48
それなら、必要な依存パッケージは全て手元にあるんだよな

ドキュメントをインストールするのに
依存関係を考慮して順番を気にする必要は無いはずだから、
スクリプトでも書いて自動化させればいいだけだと思うが

Haskell で書いたっていいわけだし

何が問題なんだ?

115:デフォルトの名無しさん
11/04/14 12:47:42.54
そういえば、cabal の config ファイルには、
ローカルレポジトリのパスを指定できる項目もある

手元の全依存パッケージをそこにぶち込めば、
"cabal install パッケージ名" でドキュメントも含めて全て
全自動でローカルからインストールされるんじゃないか?

俺は興味ないから詳しくは知らんが、調べてみる価値はあるかも

116:デフォルトの名無しさん
11/04/14 13:00:10.67
はいやってみます
有り難うございました

117:デフォルトの名無しさん
11/04/14 13:19:05.94
ライブラリの使い方が分からないから論文みるて

118:デフォルトの名無しさん
11/04/14 20:08:18.94
昔、Data.Bijection の使い方が分からなくて調べていたら
There and Back Again: Arrows for Invertible Programming
という論文にたどり着いたことはある

まぁ、使い方という言うか、どちらかと言えば意味が知りたかったんだが

119:デフォルトの名無しさん
11/04/15 05:09:31.70
統計学パッケージはあるけど
サンプルからヒストグラムを生成してくれるライブラリは無いようですね

120:デフォルトの名無しさん
11/04/15 07:19:20.21
標準ライブラリの Data.Array の accumArray がまさにその機能を持つのだが、
そういうことではない?

121:デフォルトの名無しさん
11/04/15 17:15:38.50
久しぶりにハスケルを調べたけど、haskell 2010 って仕様ができたんやね。
もう浦島だな。苦笑
ところで
N + K パターン って 再帰とは違うの? 再帰であることの十分条件?

それでアマゾンみてるとcraft3eになって10年以上ぶりに改定されるんやね。

なんかなにもかも浦島です。

122:デフォルトの名無しさん
11/04/15 19:07:20.29
>>121
N+K パターンは再帰とは何も関係ない

f (x+1) = x

という関数 f を 4 に適用すれば 3 + 1 の 3 と変数 x が束縛される(x = 3)
ただそれだけの話

正確な意味論は
URLリンク(www.haskell.org)
ここの Figure 4 にある case s を見てくれ
意味は分かるだろ

123:デフォルトの名無しさん
11/04/15 19:18:26.62
>>122
そうゆうことか。さんくす。

124:デフォルトの名無しさん
11/04/15 19:48:23.95
しかし、N+K パターンほど応用範囲の狭い構文糖衣も無いな

125:デフォルトの名無しさん
11/04/15 23:39:58.07
failとn+kは抹殺すべき

126:デフォルトの名無しさん
11/04/15 23:59:13.44
単相性制限ちゃんは悪くないよ

127:デフォルトの名無しさん
11/04/16 00:55:27.91
>>126
Real World Haskell 第6章10節に、望まれても愛されてもいないので、
Haskell標準の次期改訂からは間違いなく外されるでしょうと言わしめた
単相性制限の有用性について詳しく

128:デフォルトの名無しさん
11/04/16 05:04:39.85
>>127
x :: Integer
x = 1
と書くより、

x = 1
と書いたほうが短い。



・・・・・・じつは、haskell report 98を読んだが、よく分からなかった。

なんか、
x = let {a = 1} in (a, a)

y :: (Int, Float)
y = x
みたいなコードがかけるとイヤだ、みたいなことが書いてあった。

それと、exportするときに型が決まっていたほうがうれしいでしょ、みたいなことが書いてあって、そりゃコンパイラの最適化はしやすいだろうと思ったが、よく分からん。

129:デフォルトの名無しさん
11/04/16 05:12:01.35
なくしたらdecidableじゃなくなると思うんだけど
最近はそれに代わるより扱いやすい制限があるの?

130:デフォルトの名無しさん
11/04/16 12:31:55.28
>>129
型が決定できなくなるってこと?
たしかに、単相性制限がなければ、型が決定できなくなるケースは増えるけど、そういった問題がなくなるわけじゃない。

例えば
f s = show $ read s
みたいなコードは単相性制限があろうとなかろうとエラーになる。

そもそも、型の不一致でエラーがでないようにするためには最も一般的な多相型が推論できればそれでよいのであり、またそのような型を推論してくれほうが便利・
そして、単相性制限があると、かえって最も一般的な多相型を推論することを妨害する。

131:デフォルトの名無しさん
11/04/16 13:47:29.30
単相性制限はHaskellで一番荒れる話題

132:デフォルトの名無しさん
11/04/16 19:12:55.65
そんな話題で熱く論争できるとは…レベル高っ

133:デフォルトの名無しさん
11/04/16 19:19:23.66
xmonadの設定ファイルの読み方を聞こうとしたものの
あまりにレベルが違いすぎて何度も書き込みをキャンセルした漏れが
泣きながら通りすぎます。

134:デフォルトの名無しさん
11/04/16 22:21:30.61
ここは初心者歓迎だよ。そもそもHaskellスレは一個しかないし

135:デフォルトの名無しさん
11/04/17 00:13:43.75
>>134
URLリンク(mainichi.jp)

136:デフォルトの名無しさん
11/04/17 09:16:39.74
俺は形式意味論研究してる立場だからhaskell使ってくれる奴が増えるのは大歓迎。
俺の考え方を押し付ける相手がいないと困るからな。

137:デフォルトの名無しさん
11/04/17 10:00:49.14
Haskellの形式意味論は公式にあったっけ?

どうでもいいが、ときどき論文に出てくるサブセットの意味論は
操作意味論 + 表示意味論で、余り純粋ではないね。
男なら表示意味論で非同期例外やI/Oも込みで押し通すべき。

138:デフォルトの名無しさん
11/04/17 10:26:58.64
非公式なら少しある

公式にはない
ない理由が「言語設計者たちが考えること」って本に書かれてたと思う

139:デフォルトの名無しさん
11/04/17 10:54:07.65
Standard ML以下か…

140:デフォルトの名無しさん
11/04/17 11:05:55.63
言語設計者たち~にはできなかった言い訳が書いてあったように覚えてる

141:デフォルトの名無しさん
11/04/17 11:43:40.03
形式意味論が完全でない、あるいはドキュメント化されていない理由は、
>>3 にある "A History of Haskell" にも書かれている

3.4 Haskell has no formal semantics

要するに、急を要する仕事ではなかったし、
それでユーザーも実装者も何とかやっていけるだろうし
そもそもユーザーにとっては型チェックが通れば意味論なんてどうでもいいだろ

それに意味論を完全に定義しちゃうと、
新機能を追加したりシェイプアップするのにかなり時間がかかる
いちいち新たに意味論を考えて既存のものとの整合性を考慮しなきゃならないからね
意味論の完全性を過剰に求めるのは、むしろ言語の進化を阻害するんだよ

とのこと

>>139
100% 完全に意味論が定義された Standard ML に比べれば、
意味論の定義の完全性という点では、理論的には全言語が Standard ML 以下だ

142:デフォルトの名無しさん
11/04/19 06:10:30.28
HaskellのGCはどれくらい最先端なのですか?

143:デフォルトの名無しさん
11/04/19 06:13:01.82
>>131
Emacs と Vim どっち好き?

144:デフォルトの名無しさん
11/04/20 16:19:47.61
そういやleksahの話題って出ないね

145:デフォルトの名無しさん
11/04/20 19:13:14.58
leksahとmanateeはyi以上にオワコン

146:デフォルトの名無しさん
11/04/21 19:19:07.82
yiっていーの?

147:デフォルトの名無しさん
11/04/21 21:30:15.72
Vimライクでない開発環境は使う気がしない
矢印キーで移動とかやってられんわ

148:デフォルトの名無しさん
11/04/22 07:06:29.18
Emacsだって矢印キー使わずとも移動できるよ
まあ例によってctrlだからvi派には合わんだろうが

149:デフォルトの名無しさん
11/04/22 14:52:39.39
宗教論争ktkr


150:デフォルトの名無しさん
11/04/22 16:44:10.72
自宅のDHCP鯖のログを見ると知らないMACアドレスが30個も接続された形跡がある。

151:デフォルトの名無しさん
11/04/22 19:06:28.68
>>147
Vimのエミュレーションモードあるみたいだよ。
Features:
Emacs, Vim and Cua (subset) emulations provided by default

152:デフォルトの名無しさん
11/04/22 22:23:30.43
数値計算やってるんですけど、デカい行列を次々に更新していくんですけど、
そのときに、行列の100万くらいある要素のごく一部だけを更新するんです

これってもしかして、行列を更新するたびに、いちいち100万くらいの要素全部をコピーし直さなくちゃいけないんでしょうか?

153:デフォルトの名無しさん
11/04/22 23:59:43.83
>>152
PreludeにもインポートされているData.ArrayのArrayを使っているなら、基本的にはそうでしょ。
ただ、「行列を更新するたびに」の「行列を更新」のタイミングは、遅延評価がかかっているとは思うけど。

対応方法としては
・IOモナド、Stateモナドの破壊的更新のできる配列を使う - 手続き的になるのが良いのか悪いのか。更新の回数は完全に制御できる
・配列ではなくData.Map(平衡二分探索木…のはず)を使う - 100万もの要素を扱うのはどうなんだろうという気がするけど、プログラミングとしては楽だと思う
・私は使ったことないけど、これ→URLリンク(itpro.nikkeibp.co.jp) ただ、いつ最適化されるのか読みきるのはHaskellへの慣れが相当いりそう

ところで、その100万くらい要素がある行列って、もっと小さなブロックに分解できないものなの?
1000 * 1000の「配列 のリスト」にするだけでも相当変わると思うんだけど。

154:デフォルトの名無しさん
11/04/23 00:37:20.46
STArrayとかSTUArrayとか使いなされ

155:デフォルトの名無しさん
11/04/23 00:39:34.41
>>153
1000×1000の行列で、対角線に沿って要素に非ゼロの数字が入ってて、対角線から離れるとほとんど要素は0
で、ノイズとしてところどころ(1000個くらい)に非ゼロの数値が入ってる
どの要素にノイズが乗るかは、まるで決まっていない
計算するときには、対角線を中心に1000~5000個の要素だけがコロコロ更新される
ノイズ部分は絶対値が0に近づく方向にだけ更新される
要素が0のところは絶対に更新されない

やっぱり破壊的更新しないとダメですかね…

156:デフォルトの名無しさん
11/04/23 00:46:40.10
>>154
よく分かってないんですけど、STArray って、破壊的更新してるんじゃないんですよね?

157:デフォルトの名無しさん
11/04/23 00:50:37.27
してるよ
Haskellでもmutableな配列はIOに汚染させずに使える
STモナドを調べておくれ

158:デフォルトの名無しさん
11/04/23 04:48:55.48
>>155
それならリストでもMapでもいけると思う。
だって、リストなりMapに存在しないデータをゼロとみなせば、実際に保持しておく必要のあるデータは千のオーダーなんでしょ。
Data.MapのfindWithDefaultとinsertで楽勝じゃね?

159:デフォルトの名無しさん
11/04/23 14:29:47.66
>>158
プログラムを書くときにはどの位置の要素にゼロじゃないデータが入るかわからないけど、上手にできますかね

160:デフォルトの名無しさん
11/04/23 16:18:28.95
>>159
0じゃない要素だけ値と座標を持てばいいんじゃない?
んでmapやhashを使えば要素数が増えても参照時間はそんな伸びないし。
残りは仮想的に扱えばいいように思える。

161:デフォルトの名無しさん
11/04/23 16:31:28.92
>>159
Data.MapのMapを前提に。

コードとしては、Data.MapのMapはkeyとvalueのペアの辞書だから、座標(Int, Int)をkeyにして、0でないデータを追加していけば良いだけ。
keyはこんなんで良かろう。
(compareをうまく定義すれば対角線に近いほど木のrootに近くできなくはないと思うけど、現実的な方法が思いつかなかった)

data Cord = Cord {-# UNPACK #-} !Int {-# UNPACK #-} !Int
 deriving (Show, Eq)
instance Ord Cord where
 compare (Cord ax ay) (Cord bx by) = compare ax bx `mappend` compare ay by

「上手に」というのはパフォーマンスの話なら、ちょっとむずかしい。
空間的には、100万要素の配列よりも、千~万の二本木のほうが小さいだろう。
速度的には、やっぱり100万要素の配列を破壊的に更新したほうが早いだろうな。

最初のデータを全部入れて木を構築するのにちょっと時間がかかるはずだけど、それは最初の一回だけだし、千から一万のデータなら気にするほどのことではなかろうと思う。
また、最初の木を構築するときに0のデータは入れないとして、データを更新するときに0にしたものを削除するかどうかはちょっと悩む。
0のデータがある程度たまってから一気に木を再構築するのが良さそうに思えるけど、よく分からん。
アプリケーションにもよると思う。更新より参照のほうがはるかに回数が多いなら、こまめに0のデータを削除したほうが良いはず。

162:デフォルトの名無しさん
11/04/23 16:55:42.08
ガウスの消去法でさえも、どうやればいいのかちょっと悩んでしまう。
Haskellってコードの作成コストと保守コストは低いかもしれんが、プログラマを養成するコストがとんでもないことにならないか?

163:デフォルトの名無しさん
11/04/23 17:05:00.33
エントロピーって言葉を知っているかい?
Haskellで得られる生産性の高さはHaskellを学ぶ労力と釣り合わないってことさ

164:デフォルトの名無しさん
11/04/23 17:14:18.16
新卒プログラマをデスマーチに投入することで生まれる
希望から絶望への相転移エネルギーを回収することで宇宙のエントロピーは減少するのさ。

165:デフォルトの名無しさん
11/04/23 17:27:26.61
何言ってるのかよくわからないからりりかSOSで例えてくれ

166:デフォルトの名無しさん
11/04/23 21:59:09.73
死屍累々たる新卒を糧にして命の花は咲くということさ。

167:デフォルトの名無しさん
11/04/23 22:12:59.71
おまいら・・・

168:デフォルトの名無しさん
11/04/23 22:40:36.42
>>162
この手の問題は、IOモナドやSTモナドで配列の破壊的更新をしてしまうという解は常にあるわけで、「Haskellらしさ」にこだわらなければ他の言語よりむずかしいということはないと思う。
モナドって何さ? というのはたしかに説明するのが難しいけど、そこはまぁ、LISPとかと同じように「変数に値をバインドしている」と考えることにすればいいわけで。
「変数に値をバインド」というのは何さ? 変数って値を入れておく箱じゃないの? といわれたら、これまた面倒だが、そこまでBASIC時代の人は無視しても良いと…

破壊的更新はHaskellらしくないと嫌う風潮があるけど、状態モナドを使ったほうが自然なアルゴリズム、破壊的更新のほうが理解しやすいプログラムというのはありえ、そういうときに破壊的更新を躊躇するのはむしろ良くないことだと思う。

169:デフォルトの名無しさん
11/04/23 23:20:42.81
アルゴリズムはその解法を実際に表現し行うシステム
(プログラミング言語や人の思考)あってのものなので

破壊的更新をする手続き的なプログラムの方が表現しやすい、だから、
破壊的更新をするアルゴリズムを採用する

破壊的更新をしない宣言的なプログラムの方が表現しやすい、だから、
破壊的更新をしないアルゴリズムを採用する

というのが本来目指す姿であって、まずはこのように考える
当然その時の自分の能力によっては、そんなに上手く行かないかもしれない
しかし、解きたい問題の本質を考えて数式で表現できれば、
破壊的更新をしないアルゴリズムを見つけやすくなる
この辺りは「Pearls of Functional Algorithm Design」で大いに学べる

もしどうしても破壊的更新をしなければならなくなった場合でも、
Haskell は逐次的にちまちまと更新するのは苦手だが、
一気に更新するのはメモリ効率的にも速度的にも記述的にもそれほど問題ない
それをするためにもできるだけ宣言的なプログラムを目指すのは意味がある

>>152 は何となく初めに破壊的更新をするアルゴリズムを採用し、
それを Haskell でどう表現しようかと、本来とは逆の思考をしているように感じる
例えば手続き型を対象とした数値計算の解説書の方法を Haskell に移植するとか

既に破壊的更新をしないアルゴリズムについて考えた後であれば余計なお世話であった

170:デフォルトの名無しさん
11/04/23 23:41:54.16
スピードを考えないなら手続き的な更新による手法の大半は
全体を丸ごと置き換えることだけ考えてれば楽ちんなんだがな

171:デフォルトの名無しさん
11/04/23 23:44:57.27
難しいことを考えなくても手続き的アルゴリズムをSTUArrayで素直に実装するだけでいいのに

172:デフォルトの名無しさん
11/04/23 23:48:33.61
UArrayすら殆ど知られてないのに、STUArrayが周知されるのはいったい何年後やら…

173:デフォルトの名無しさん
11/04/23 23:54:51.84
難しいことを考えずに素直にJavaで実装すればおk

174:デフォルトの名無しさん
11/04/24 00:02:52.80
Haskell as a better Java

175:デフォルトの名無しさん
11/04/24 00:35:55.98
>170
F#への新参者だが丸ごと書き換えるのはいろいろと楽でいいねぇ。
大方の場合、パフォーマンスでも問題ないし。

176:デフォルトの名無しさん
11/04/24 07:11:17.72
> エントロピーって言葉を知っているかい?
エントロピーって単語を使ってみたかっただけだよな?
頼むからそうだと言ってくれ


177:デフォルトの名無しさん
11/04/24 10:11:39.70
>>176
魔法少女まどか☆マギカって知ってるかい?

178:デフォルトの名無しさん
11/04/24 10:52:49.22
最近のアニメって浅い知識で専門用語使いたがるね。正直萎えるわ

179:デフォルトの名無しさん
11/04/24 10:55:28.58
そんな事言ったらこの世からSFがすべて無くなるぞw

180:デフォルトの名無しさん
11/04/24 11:02:28.28
関数型言語と気軽にいうが、言葉の意味をきちんと説明できる人
が皆無なのと同じことだ

181:デフォルトの名無しさん
11/04/24 11:10:04.05
アニメを含む娯楽作品は、作者の思いが込められたりはするが、
それを深読みしたり現実の世界と繋げたりすることは二の次で、
まずは純粋に楽しめよ

Haskellも関数型とかモナドとかはとりあえず二の次で、
まずは純粋に楽しめよ

182:デフォルトの名無しさん
11/04/24 11:28:14.57
楽しむよりもビジネスにするのが大事だと思うが。

183:デフォルトの名無しさん
11/04/24 11:37:48.10
ビジネスとか言ってる奴笑えるw

184:デフォルトの名無しさん
11/04/24 11:56:54.31
>>182
それも大いに大事だが、そちらはお前ががんばってくれ

おれは純粋に楽しむ

185:デフォルトの名無しさん
11/04/24 11:58:31.29
>>178
本格SFでさえ専門家から見ればプププなんじゃないの?


食らえ!アローモナド!

くくく……単相性制限下においてそのようなコンパイルなど通らぬわっ!


しまった!チュドーン……

くらいいい加減なものじゃないか
小説の専門用語なんて

186:デフォルトの名無しさん
11/04/24 12:07:15.74
関数型言語の基本はなにより楽しむことだからな
だってふぁn

187:デフォルトの名無しさん
11/04/24 12:31:55.84
楽しくプログラミングできる
→プログラマの創造性が生かされる
→良いプログラムが出来上がる
→顧客増える
→ビジネス成功

188:デフォルトの名無しさん
11/04/24 12:32:40.68
fun of programmingっていうタイトルにはそういう意図があると聞いたことがある

189:デフォルトの名無しさん
11/04/24 12:42:43.02
>>188
当たり前みたいだし短いけど、中身もあっていいタイトルだよな

190:デフォルトの名無しさん
11/04/24 12:51:28.37
関数型言語がもてはやされる理由に自動プログラミング(笑)への展望がある

191:デフォルトの名無しさん
11/04/24 13:05:08.30
>>190
初めて聞いた

192:デフォルトの名無しさん
11/04/24 13:07:03.21
並列化への親和性の高さも一つの理由だけどね。

193:デフォルトの名無しさん
11/04/24 13:12:10.67
自動プログラミングというか形式的手法?
coqとかagdaみたいな定理証明系を利用して高い信頼性を持ったコードを書くとかそういうやつかw

194:デフォルトの名無しさん
11/04/24 13:23:48.44
急に書き込みが増えたけど、規制解除されたのか?

195:デフォルトの名無しさん
11/04/24 13:35:56.95
俺がネット再開できて興奮してるだけ

196:デフォルトの名無しさん
11/04/24 13:39:30.19
震災で鬱にならないためには楽しんだ方がいいってホンマでっかTVで言ってた。

197:デフォルトの名無しさん
11/04/24 14:23:38.92
Haskell プログラミングのおかげで就職できる場所は大学だけだと思う

198:デフォルトの名無しさん
11/04/24 14:33:02.82
Haskellプログラミングをしている人はHaskellの構文やライブラリだけに詳しいわけじゃない。
就職できるとかできないなんて低レベルな話にも興味がない。

199:デフォルトの名無しさん
11/04/24 14:42:47.01
関数型言語を仕事で直接に使うことは少ない(若しくは無い)が、
関数型言語の知識を知っていると良いコードを書けるから仕事で役に立つというのはあると思う

200:デフォルトの名無しさん
11/04/24 14:57:47.71
>>198
ハスケラー=社会性0の人ということで馬鹿にしてんのか?

201:デフォルトの名無しさん
11/04/24 15:03:33.24
>199
F#だがバリバリ製品コードで使ってるぞ(´・ω・`)

202:デフォルトの名無しさん
11/04/24 15:08:43.91
現場で一番動いてるのプログラムのソースはアセンブラ
次がC言語
次がJava
次がC++
だいぶ離れて次がBasic

203:デフォルトの名無しさん
11/04/24 15:12:15.61
>>200
Simon Thompsonが書いたErlang本を読んだ

filterやreverseを自分で実装させるあたり
教育的配慮に富んだ本だなと思って読み進めていたところ
3章の練習問題がコンパイラ作成で悶絶した

Haskellerというのは社会性がないというか
手加減を知らない人たちなんだろうな。そう思った

204:デフォルトの名無しさん
11/04/24 15:30:08.39
関数型言語やってる
=計算機科学はもちろんのこと、数理論理学や情報理論などの基礎理論にも通じている
=技術を使うだけではなく技術を生み出すことにも長けている
=イノベーティブな技術を展開し常に業界を牽引していく人材

205:デフォルトの名無しさん
11/04/24 15:41:42.60
計算機科学と情報理論に通じてなくてもなんとかなるのが関数型言語
むしろ、計算機科学と情報理論に通じてる人にはHaskellは難しい

206:デフォルトの名無しさん
11/04/24 15:57:25.90
>>205
もっと詳しく聞かせてくれ

207:デフォルトの名無しさん
11/04/24 16:08:57.92
>>206
ハードウェア→アセンブラ→C・Java→Haskell のルートよりも、
論理学→基礎数学→Haskell のルートの方が楽

208:デフォルトの名無しさん
11/04/24 16:33:35.20
>>207
明らかに前者のほうが敷居が低い。
中卒・高卒でもなんとかなるレベル。

後者は数学的センスが無いと無理。

209:デフォルトの名無しさん
11/04/24 16:34:39.63
>>205
「使うだけならね」w

210:デフォルトの名無しさん
11/04/24 16:35:37.96
>>203
> filterやreverseを自分で実装させるあたり
> 教育的配慮に富んだ本だなと思って読み進めていたところ
> 3章の練習問題がコンパイラ作成で悶絶した

ワロタ
RWHで基礎が終わったな、というところで出てきた実践トピックが画像認識だったところで、オレもあせった

211:デフォルトの名無しさん
11/04/24 16:39:11.57
>>208
メモリアドレスとか、レジスタとか、スタックとかを抽象化せずに、ああやって、こうやって、こうやればやりたいことができるというパズルを解くのは、それはそれで一種のセンスがいると思う…
たぶん世間のほとんどの人はそういうパズルはとけない。

212:デフォルトの名無しさん
11/04/24 16:52:36.66
で、結局Haskell製の有名なソフトウェアはあるのかね?

213:デフォルトの名無しさん
11/04/24 16:54:14.65
>>212
GHC

214:デフォルトの名無しさん
11/04/24 16:54:17.93
>>211
そういう経験は中学・高校で済ませた。
高校時代はZ80で制御するマイクロマウスで大会にも出場したし、
あるゲーム雑誌にも自作のゲームを投稿したりした。
知識基盤がいらないテクニックだけなら中高生でも簡単に習得できるんだよ。
テクノロジーとテクニックは違う。
テクノロジーは知識の蓄積が必要で他人に伝えることもできるが、
テクニックは個人の修練でしかない。

大学では物理学を学び、大学院では計算機科学と整数論を学んだ。
大学時代はスパコンでシミュレーションプログラミングをしたし、
院卒後ある人工衛星のプロジェクトにも参加してプログラムを担当したが、
主に物理と数学の知識が役に立った。

215:デフォルトの名無しさん
11/04/24 16:56:24.99
>>212
Haskellは論文を書くための言語

216:デフォルトの名無しさん
11/04/24 17:49:23.83
>>215
論文を書くためにHaskellを使った例(タイトル)をいくつか挙げてくれ

217:デフォルトの名無しさん
11/04/24 17:55:16.51
>>216
URLリンク(arxiv.org)
URLリンク(arxiv.org)

218:デフォルトの名無しさん
11/04/24 18:07:02.26
それは論文を書くためにHaskellを使ったんじゃなくて、
研究のためにHaskellを利用したんだよ

Haskellを手段として行った目的は論文を書くことじゃなくて、研究だよ

>>215 は論文を書くのが目的、その手段がHaskellだと
実に馬鹿なこと考えてるんだよ

219:デフォルトの名無しさん
11/04/24 18:16:11.12
>>218
大学の研究者にとっては論文を書くのが目的
研究は論文を書くための手段でしかない(研究しない方が論文を書けるなら研究なんかしない)
Haskellはその研究の手段でしかない

研究業績とは研究への熱意じゃなくて論文の数

220:デフォルトの名無しさん
11/04/24 18:27:57.55
お前ら、大学生みたいな幼稚な会話ばっかりすんなよ

221:デフォルトの名無しさん
11/04/24 19:02:34.79
>>219
その域を超えられないなんて可哀想

222:デフォルトの名無しさん
11/04/24 19:10:48.26
俺もその域越えたい
その域を越えられたらもう論文書かなくてもいいのかな・・・

223:デフォルトの名無しさん
11/04/24 19:41:42.85
論文書かなきゃ生活が成り立たないという話が好きな人が多いな。

224:デフォルトの名無しさん
11/04/24 19:41:47.54
好きで研究すれば公開したくなる、書きたくなる

昔、先生が言ってた

225:デフォルトの名無しさん
11/04/24 20:00:30.30
どうせ学生だろ、お前ら。
学生なら論文とかくだらないこと考えてないでもっと面白いことかんがえろ。

226:デフォルトの名無しさん
11/04/24 20:42:08.41
>>150
ごめん

227:デフォルトの名無しさん
11/04/24 20:53:38.09
>>217
二つ目のリストにある「Yacc is dead」というタイトルがカッコ良すぎるんだが。
中の「Cargo cult parsing」という言い回しもカッコいい。

228:デフォルトの名無しさん
11/04/24 21:02:55.14
論文は数だよ兄貴

229:デフォルトの名無しさん
11/04/24 21:19:50.24
こりゃ研究機関も仕分けだな

230:デフォルトの名無しさん
11/04/24 21:39:24.65
>>203
なんと言うか、関数型言語の本って出せる機会が少ないからなのか、入門書なのに入門書の域を越えて詰め込もうとする傾向は有るな

ちゃんと入門者向けの本、中級者向けの本、上級者向けの本って別れたら、むしろ手続き型言語より分かりやすいのに


231:デフォルトの名無しさん
11/04/24 21:42:50.27
>>207
無駄が大杉

c・java -> haskell
算数 -> haskell

で十分

んで、後者の方が楽

haskellなんぞ、算数の知識があれば十分理解出来る


232:デフォルトの名無しさん
11/04/24 21:43:16.70
カネをぶんどれる論文がいいよ。

233:デフォルトの名無しさん
11/04/24 21:53:20.70
>>231
Haskellを覚えるのが目的だなんて、貧相な奴だな。

234:デフォルトの名無しさん
11/04/24 21:58:15.47
>>233
他の知識はhaskell使える様になってから覚えれば良いだろ
初心者に知識の詰め込みを強要し過ぎ


235:デフォルトの名無しさん
11/04/24 22:01:03.84
あらいぐま haskell

236:デフォルトの名無しさん
11/04/24 22:04:47.62
ファイナルfunだしー
 ある日世界中に散らばってしまったクリスOkasakiの知識を集めながら、ジョブを得(ry

237:デフォルトの名無しさん
11/04/24 22:52:14.20
>>235
そういうの、あたしは嫌いじゃないな
誰か あらいぐまハスケルたん 描いて

238:デフォルトの名無しさん
11/04/25 06:57:45.67
このスレ女が居るのか

239:デフォルトの名無しさん
11/04/25 07:12:03.42
んなわけないだろ

240:デフォルトの名無しさん
11/04/25 08:49:18.18
そうか気のせいか

241:デフォルトの名無しさん
11/04/25 09:43:17.41
女ですがなにか

242:デフォルトの名無しさん
11/04/25 09:58:54.35
このスレ女が居るのか

243:デフォルトの名無しさん
11/04/25 12:48:28.06
Haskellと2chをやっている女なんて、アレだろ。

学校の成績はほどほどだけど妙に偏った知識があって、メガネで、ぼさぼさの頭でTシャツの上にカーディガンでキャンパスにくる。
合コンでは、一人でウーロンハイを飲んでいて、声をかけたら「いや、楽しんでますよ」とか曖昧な笑顔をする。

オレの嫁にしてやる。

244:デフォルトの名無しさん
11/04/25 13:12:21.90
性同一性障害の女でもない限り、haskellに興味なんか持たんよ

245:デフォルトの名無しさん
11/04/25 13:19:51.14
haskellは道具であって目的ではないからな。
haskellを目的と勘違いしているやつがこのスレには多そうだが
女は道具としてなら使うだろう。

246:デフォルトの名無しさん
11/04/25 13:24:43.55
flipって遅くなるの?
それとも最適化かかる?

247:デフォルトの名無しさん
11/04/25 13:33:06.99
haskellを使ってwebサイト作ってみたいんだけど、参考になる書籍とかサイトってある?
何のライブラリを使ってとか全然分からん

248:デフォルトの名無しさん
11/04/25 13:46:20.79
>>246
{- scrach.hs -}
module Srach (x, y) where
x = flip (+) 10 20
y = (+) 100 200

この単純なコードを ghc -O2 -fforce-recomp -ddump-simpl scrach.hs してみた(かなり要約):

Srach.y2 = GHC.Integer.Type.S# 100
Srach.y1 = GHC.Integer.Type.S# 200
Srach.y = GHC.Integer.plusInteger Srach.y2 Srach.y1

Srach.x2 = GHC.Integer.Type.S# 20
Srach.x1 = GHC.Integer.Type.S# 10
Srach.x = GHC.Integer.plusInteger Srach.x2 Srach.x1

この例では、最適化されると分かる。

249:デフォルトの名無しさん
11/04/25 14:10:53.57
>>248
なるほど、つまり単純なケースでは最適化かかるみたいだけど
複雑なケースではわからないから
結局の所実測してみて使うか決めるしかないんだ
一々下らない事訊くんじゃないこのうすのろ
って事ですね有り難うございました(´・ω・`)

250:デフォルトの名無しさん
11/04/25 14:11:38.13
>>247
haskell http server でググれば?


…方向性として三つあると思う。

一つ目。
UNIXのSocket(あるいはWindowsのWinSoketだっけ?)プログラミングをすでにCで習得しているなら、ちょっとした実験は、そのAPIのHaskellバインディングを使うのが簡単だろうな。
簡単なWebクライアント・プログラムを書いたことがあるが、それの動作確認・デバックのためのサーバースタブ側はこれで作った。

二つ目。
サーバーはApacheかなんかを動かして、ghcであらかじめ用意しておいた実行形式ファイルをキックする。
これも試したことある。
個人サイトでちょっと試してみたいなら、たぶん、一番簡単。
runghcをキックするスクリプトを書いて、Apacheからはそれをキックするようにすれば、事前のコンパイルも必要なかろう。

三つ目。
なんらかのフレームワークを使う。
URLリンク(www.haskell.org)
オレはどれも試したことない。

251:デフォルトの名無しさん
11/04/25 14:22:45.67
なんかイライラするな。
空気めないやつってよくいわれない?

252:デフォルトの名無しさん
11/04/25 14:40:50.64
はい すいません Perl忍者が最近煽りに来ないので
代わりに僕がと思いまして

253:デフォルトの名無しさん
11/04/25 16:30:52.53
>>250
ありがとう
runghcが使えるってのは便利だね
apacheからキックする方法で試してみる

254:デフォルトの名無しさん
11/04/27 10:44:17.46
Allow教えて

255:デフォルトの名無しさん
11/04/27 11:15:10.70
型を見てかんがえろ

256:デフォルトの名無しさん
11/04/27 11:21:28.49
意地悪><

257:デフォルトの名無しさん
11/04/27 11:23:25.59
てかArrowの話は過去ログでさんざん語られたはずだろ。

258:デフォルトの名無しさん
11/04/27 12:13:04.96
何だこのArrow!&&&か?

259:デフォルトの名無しさん
11/04/27 12:42:46.42
>>254
Allow じゃなくて Arrow な

Arrow の何が知りたいのか具体的に聞いてくれ

260:デフォルトの名無しさん
11/04/27 12:44:46.87
Arrowは車輪の再発明なの?

261:デフォルトの名無しさん
11/04/27 12:45:40.83
車輪の再発明の意味を調べてからもう一度おいで

262:デフォルトの名無しさん
11/04/27 12:47:03.67
>>260
Arrowと同じアイデアをArrow登場以前にHaskellで実装されていたのなら教えてくれ

263:デフォルトの名無しさん
11/04/27 12:50:27.82
自分の書いたコードが正格か非正格か判定する指針について教えて下さい

264:デフォルトの名無しさん
11/04/27 12:53:54.32
Arrowは構造化プログラミングに関しては副産物として再発明したに過ぎないの?
真の用途は?

265:デフォルトの名無しさん
11/04/27 13:00:37.11
単射とか全単射とかあるだろ。それだよ。

266:デフォルトの名無しさん
11/04/27 13:04:46.68
(´・ω・`)はい

267:デフォルトの名無しさん
11/04/27 14:01:28.24
射って翻訳するけど矢の方が的を射ているよ。
関数 f :S→Tの矢印が矢のように見えるだろ。
この矢の一般化が圏論と言われているのだよ。
別名アーチェリーともいう。

268:デフォルトの名無しさん
11/04/27 14:08:17.35
的を得る、な。

269:デフォルトの名無しさん
11/04/27 14:15:23.47
>>268
:(;゙゚'ω゚'):マジで?

270:デフォルトの名無しさん
11/04/27 14:28:19.23
アーチャリー

271:デフォルトの名無しさん
11/04/27 15:48:11.88
>>268
その親父ギャグはつまんない。親父ギャグって脳の老化なんだってよ。

272:デフォルトの名無しさん
11/04/27 15:53:54.16
>>268
それマジで言ったん?ソースあんならすぐ出せ
マジなら2ちゃんねら総力上げて書き直すが

273:デフォルトの名無しさん
11/04/27 15:56:07.78
軍事:作戦指揮・統帥
法学&司法:作戦参謀
馴れ合い:兵隊召集&前線指揮
少年犯罪:少年法を盾に活動
無職・だめ:鉄砲玉要員
野鳥観察:見張り要員
vip:祭り要員
モ娘(狼):ストーキング
河川・ダム:水攻め
園芸:穴掘り要員
車・バイク:交通、特攻
オカルト:儀式
PC各種:IT部隊
ダウソ:サイバーテロ
ハード・業界板:工作活動
案内:情報管理、資料作成&管理
無線:独自の通信網構築
ニュー速:情報収集
写真撮影:盗撮、記録映像
ネトヲチ:ネット監視
実況(番組):マスコミ情報確認
就職&転職:企業調査
社会・世評:世論調査&操作
男性論女性論:プロファイリング
世界情勢:世界に発信
マスコミ:タレコミ
警察:通報
アウトロー:丁寧に苦情申し立て
ちくり裏事情:密告
運営:工作員排除

274:デフォルトの名無しさん
11/04/27 15:56:54.07
be:賞金(ポイント)収集&配布
議員・選挙&政治家語録:政治介入
運輸・交通:物資運搬
花火:火薬調達
科学&物理&生物:BC兵器開発
郵便・郵政:ヒットマン用衣装提供
FLASH:FLASH製作
半角二次:応援ポスター制作、漫画・アニメ系板住民釣る
ダンス:応援ダンス製作
AA:AA製作
音楽各種板:鼓舞
お菓子:うまい棒補給
環境・電力:自家発電
ペット・癒し:精神安定
介護・福祉:負傷者介護
ボランティア:各種サポート
戦国時代:動かざること山の如し
ネ実:現実逃避
自衛隊:最終兵器

275:デフォルトの名無しさん
11/04/27 18:34:43.03
正鵠を得るから来ているので的を得るが正しい
そもそも、射るのは矢の方で的じゃない
矢を射て的を得るだ

276:デフォルトの名無しさん
11/04/27 19:29:07.00
だから、滑ってるのに。。。

277:デフォルトの名無しさん
11/04/27 20:31:36.36
そもそも、なんでinjectionやsurjectionの訳語に「射」を使ったんだろう?
写像なんだから「単写」「全写」とすべきだったのではないのか。

278:デフォルトの名無しさん
11/04/27 21:29:23.28
>>277
そんなこと考えたこともなかった。
jectがラテン語で「投げる」という意味らしいから、「写す」よりも「射る」のほうが若干違いかな。

279:デフォルトの名無しさん
11/04/27 21:30:20.23
>>278
×違いかな。
○近いかな。

280:デフォルトの名無しさん
11/04/27 21:42:45.12
>>277
矢印を書いて説明してたから

281:デフォルトの名無しさん
11/04/27 21:44:48.67
写像を説明するときも矢印を書くべきだったな

282:デフォルトの名無しさん
11/04/27 21:47:58.81
写像はmapだから区別したかったんでしょう

むしろ、injection と return をごっちゃにしてるのを問題にすべき

283:デフォルトの名無しさん
11/04/28 00:08:54.76
なんかすごい核心臭いんだが、突っ込みづらいな。

284:デフォルトの名無しさん
11/04/28 03:47:39.78
ghcのガベコレはJVMのそれの足下にも及ばないの?

285:デフォルトの名無しさん
11/04/28 14:17:52.66
Mapの更新ってミュータブルにやるの?

286:デフォルトの名無しさん
11/04/28 17:01:05.92
>>285
更新に必要な部分は、もちろん以前のものを破壊的更新せずにコピーしているはずなので、その意味ではイミュータブル。

しかし、以前のスレで話題になったリストと同じだけど、運がよければコピーしなければならない「更新に必要な部分」は少ない。
削除や追加で木のローテーションが起きなければ、「更新に必要な部分」は木の根元から更新したい葉まで一直線に結んだ部分だと思う。
ローテーションが起きれば最悪、木全部を作り直しと同じ空間コストじゃないかな。

287:デフォルトの名無しさん
11/04/28 17:21:16.76
(´・ω・`)はい

288:デフォルトの名無しさん
11/04/28 20:43:52.36
最悪でも木の高さに比例するメモリ操作で済むよ

回転一回あたりに確保されるメモリの大きさは定数で、
回転の回数は最大でも木の高さに等しい

289:デフォルトの名無しさん
11/04/29 11:19:56.09
二つの木t1 t2を比較する時に
葉同士の比較まで潜った後その上の幹に一旦戻って別の前提条件で比較
(重いので葉同士の比較が失敗した時だけ行うようにしたい)とかするには
現在見ている木の上を参照するために潜るたびに現在の木そのものを渡す
つまり一つ上の木を常に保持するようにしなきゃならんのですかね?

290:デフォルトの名無しさん
11/04/29 20:31:21.23
何がやりたいのか分からんが想像で答えると、
「比較が失敗した」ことを示す値を返して、
一つ上のレベルはその値を見て対処すればいいんじゃね

291:デフォルトの名無しさん
11/04/30 08:27:51.94
なぁ結局そういうデータ構造は副作用行ける言語なら内部で副作用させてカプセル化しとけば、スピードも速くておけーとこでFAすか。

292:デフォルトの名無しさん
11/04/30 11:42:29.23
意味が分からん、まともに話せ

293:デフォルトの名無しさん
11/04/30 11:46:22.59
説明は遅延されているので、必要に応じて評価してください

294:デフォルトの名無しさん
11/04/30 11:55:53.87
継続渡しスタイルだと引数にこれからやること全部渡すんだぜ
信じられないだろ

295:デフォルトの名無しさん
11/04/30 11:56:51.50
>>293
そのギャグが面白いと思う人ってどのくらい居るんだろ

296:デフォルトの名無しさん
11/04/30 12:17:44.99
関数型言語(主にLISP)の書籍とかWebサイトで、「こんな関数も継続渡しスタイルだと末尾再帰にできるよ!」っていう紹介があるけど、ああいう書きかえって実践的に意味あるの? たんに悟りを得るための公案?

297:デフォルトの名無しさん
11/04/30 12:29:27.28
無駄に増設したメモリを使い切りたいときに役立つ

298:デフォルトの名無しさん
11/04/30 12:40:35.92
言語のスタックを使わずに実行できるから使ってるメモリ量が自明とか
オレ言語のインタープリタを作ってCPSに変換するとコンパイラになるとか

意味ないな

299:デフォルトの名無しさん
11/04/30 12:43:21.96
>>296
末尾再帰にすることによって確実に処理速度が上がる言語であれば、
処理速度を上げるために多少視認性を犠牲にしてでも末尾再帰にする意味はある
たんに悟りを得るための公案では断じてない

が、本来は(というか理想は)コンパイラがその書き換えを自動でやるべきこと

例えば GHC の場合、末尾再帰ではなく deforestation の話だが、
ソース中にヒントを書いておくことでプログラマの代わりにコンパイラが
自動でやってくれる(まだまだ完璧ではないが)

300:デフォルトの名無しさん
11/04/30 14:47:16.22
Haskellは遅い
C++には適わなくともせめてJavaには勝って欲しい

301:デフォルトの名無しさん
11/04/30 14:54:03.14
そうだな
プログラマが工夫しなければ、まだまだ遅いな

302:デフォルトの名無しさん
11/04/30 15:34:49.89
速くなる余地がまだまだたくさんあってそれが生かされればC++やJavaと同等になるとは聞く

303:デフォルトの名無しさん
11/04/30 15:57:19.87
やたらと楽観的な見通しを述べる奴が結構な割合でいるからな

304:デフォルトの名無しさん
11/04/30 16:01:00.09
>>296
・論文を書くときに数学的な表現を統一できる
・「これは末尾再帰で表現きるから、定理○○が成り立つ」みたいな言い方ができる
・末尾再帰専用の高速化手法がある
・というか、Schemeは全部の関数が継続渡し

305:デフォルトの名無しさん
11/04/30 16:06:11.32
開発期間から実行時間や保守費用まで全部含めて考えたとき、Haskellを完璧に理解してる人間がプログラミングすればC++にも勝てると思ってるけど、そうでもないの?

実行時間だけ考えればアセンブラ最高だし
航空機のプログラミング言語見たことあるけど、Cのソースコードにアセンブラが埋め込んであった

306:デフォルトの名無しさん
11/04/30 16:24:12.32
航空機とかエヴァのマギシステムってGC使えるの?
悠長にゴミ集めしてる場合じゃない局面があると思うの

307:デフォルトの名無しさん
11/04/30 16:38:09.79
Haskellをランタイムを含めてフルに使うんじゃなくて
型システムだけ使ってメモリ管理は手でやるとかもありそう
sel4みたいにverificationのみに使うとか

308:デフォルトの名無しさん
11/04/30 16:48:35.09
形式手法が目当てならHaskellよりもっといいものが他にある

309:デフォルトの名無しさん
11/04/30 17:13:27.58
>>306
航空機の場合、悠長にゴミ集めしてる場合じゃない局面では無い時に必死でゴミ集めして、
悠長にゴミ集めしてる場合じゃない局面でゴミ集めしないで働ける保証があるなら、GC が使える
その保証を得るのが難しいと思うが

エヴァのマギシステムの場合、ヒトと同じような思考をするコンピュータなので、
そもそもGC的な意味でのゴミがゴミで無くなる
人の記憶も不要な記憶(短期記憶でさえ)がゴミとして消されるわけじゃなく、
以前の記憶やその後に作られた記憶と絡み合う

310:デフォルトの名無しさん
11/04/30 17:16:44.47
このスレの古参でHaskellに見切りつけた人っている?

311:デフォルトの名無しさん
11/04/30 17:21:28.45
>>306
MAGIはそもそもノイマン式コンピュータかどうか…
あれ、有機体を使ってあっても驚かない。

JavaでリアルタイムGCを使ってロボットを動かす研究とかあるから、いずれは飛行機のデバイスもGCを使うようになるかも。

あと、個人的には、一つ二つのユニットがGCで時間かかりすぎ→強制リブートとなっても、冗長性を保っていれば問題ない、っていう発想はありえると思う。
そういう思想は飛行機とか、医療機器とかの世界ではまだまだ受け入れられないかな。

312:デフォルトの名無しさん
11/04/30 17:21:53.24
>>309
例外的にそういう局面に急に陥る事もあると考えると
やはり危ないのでは

313:デフォルトの名無しさん
11/04/30 17:29:33.97
航空機とかは、そもそも「ゴミ」を発生させてはいけない
途中で消えるオブジェクトを用意してはならない
全部staticでメモリが用意される

と昔に習った気がする

314:デフォルトの名無しさん
11/05/01 02:42:08.24
"Plugging a Space Leak with an Arrow" という論文に、

succ n = n : map (+1) (succ n)

は計算に O(n^2) の時間がかかるが、

succ n = let ns = n : map (+1) ns ; in ns

にすれば改善できる、と書かれていました。
(オーダーが下がるとは明記されていない)

前者は succ n を毎回簡約しなければならないのに対して、
後者は最初に1回だけ簡約すれば、それが ns の参照先として保存されるため、
簡約ステップ数が前者に比べて少なくて済むのは分かります。

しかし、ノートに簡約ステップを書き出してみたところ、
後者も依然として O(n^2) のステップ数が必要に感じたのですが、
オーダーは実際には下がっているのでしょうか?

315:デフォルトの名無しさん
11/05/01 04:23:26.98
>>314
succ n = n : map (+1) (succ n)
これ↑無限ループのような気がします


316:デフォルトの名無しさん
11/05/01 05:36:44.26
>>314
nの値は計算量に関係ないよな。take m (succ n)の評価を考える
まずリスト部分だけ簡約すると、

let
  x1 = n + 1
  x2 = x1 + 1
  x3 = x2 + 1
(...略...)
  xm = xm' + 1
in n : x1 : x2 : x3 : ...略... : xm : []

みたいになる。ここまで簡約する計算量がO(m)
ここから足し算をすべて計算するのもO(m)だから、合わせてO(m)時間

317:デフォルトの名無しさん
11/05/01 06:57:01.00
>>314
>>316のいうとおり、nの大きさは計算量に関係ないが、しかし、take m (succ n)としたとき前者はO(m^2)、後者はO(m)のオーダーになっているように思う。
前者はいわば
let
 x1 = n
 x2 = n + 1
 x3 = n + 1 + 1
 x4 = n + 1 + 1 + 1



in x1 : x2 : x3 : x4 ...

のような計算をしている。しかし、後者は
let
 x1 = n
 x2 = x1 + 1
 x3 = x2 + 1
 x4 = x3 + 1



in x1 : x2 : x3 : x4...

のような計算をしている。

前者はx1、x2...に相当するようなものを覚えていないが、後者はnsの中で覚えているので。
簡約と一緒に、コンスセルの間の矢印を書いたほうが良い。
そうすれば、前者だといちいち計算しなおしているものを、後者だと共有していることが分かるはず。

318:316
11/05/01 07:44:49.25
.>>317
それと同じことが言いたかった
>>316は後者についての話ね

319:317
11/05/01 07:56:37.26
>>318
む。オレの読解力が足りなかったみたい。スマン。

320:デフォルトの名無しさん
11/05/01 08:39:16.51
Haskellのプログラムを書くときは
コンスセルのグラフが評価のたびに書き換わっていくイメージ
で書くと良いかも。

321:デフォルトの名無しさん
11/05/01 10:22:21.44
T (take m (succ n))みたいな式を変形していったら
A + B + ... T m * Tm + ...という形になるからO(m^2)
A + B + ... C * (T m) + ...という形になるからO(m)とかそういう手法は無いの?

322:デフォルトの名無しさん
11/05/01 13:29:46.92
I couldn't manipulate Parsec module.
Can anyone show the way to parse (and convert to a list afterward)
"(3)[1e-2,0.1,1.0]"
which means
(length)[elements]

...Sorry about English. Please reply in Japanese!

323:デフォルトの名無しさん
11/05/01 14:09:13.39
Parsec2で
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Language
import Text.ParserCombinators.Parsec.Token

sizedListParser :: CharParser st [Double]
sizedListParser = do
  size <- between (char '(') (char ')') int
  list <- between (char '[') (char ']') $
    double `sepBy` char ','
  if fromIntegral (length list) == size
    then return list
    else fail "length mismatch"

int :: CharParser st Integer
int = decimal haskell

double :: CharParser st Double
double = float haskell

324:デフォルトの名無しさん
11/05/01 14:23:34.00
Thank you for your simple solution!
It rejects minus sign and integer mixed array, but I'll try to figure it out.
Hope there's a good documentation on the parsec...

325:デフォルトの名無しさん
11/05/01 14:43:35.68
偶然だろうけど、>>323が一文字だけ日本語なのに妙な律儀さを感じてウケた。

326:314
11/05/01 14:45:41.62
すいません、n には依存しませんね。
私も自分で take m で計算量を調べてました。

まだ納得できないです。
後者の計算で、次のようなステップを考えてました。
take の第1引数の引き算を端折ったり、冗長なステップもありますが、
問題はそこではありません。

[01] take 3 (succ 1)
[02] take 3 ns -- <== ns = 1 : map (+1) ns
[03] take 3 (1 : map (+1) ns)
[04] 1 : take 2 (tail ns)
[05] 1 : take 2 (map (+1) ns)
[06] 1 : take 2 (map (+1) (1 : map (+1) ns))
[07] 1 : take 2 (((+1)1) : map (+1) (tail ns))
[08] 1 : ((+1)1) : take 1 (map (+1) (tail ns))
[09] 1 : ((+1)1) : take 1 (map (+1) (map (+1) ns))
[10] 1 : ((+1)1) : take 1 (map (+1) (map (+1) (1 : map (+1) ns)))
[11] 1 : ((+1)1) : take 1 (map (+1) (((+1)1) : map (+1) ns))

コンスセルの指しているものをグラフを描いて考えてみたのですが、どうしても、
[11] の左側の ((+1)1) と右側の ((+1)1) が別物にしか思えないです。
つまり、たまたま同じ引数に同じ関数を適用しているだけで、
結局のところ2回同じ計算しなければならないと思います。

これらが同じものを指しているのなら、
>>317 の後者のようにリストの各要素は定数時間で計算できるのですが、
別物を指しているように見えるので、リストの各要素は線形時間かかるように見えます。
(全体の計算量というのは結局のところ、簡約ではなくプリミティブな計算の量ですよね)

なぜ左側の ((+1)1) と右側の ((+1)1) が同じものと言えるのか、もう少し考えてみます。
(ちなみに、(+1) は両者で同じ物、1 も両者で同じ物だと思います)

327:デフォルトの名無しさん
11/05/01 17:35:44.94
c言語でデバッグするときは、適当にprintf文を書きますよね?

Haskellでデバッグするときってどうするんですかね?
putStrを挿入したら、関数の型がIOに変わってしまいますけど、他に方法ないですかね?

328:デフォルトの名無しさん
11/05/01 17:55:21.50
>>327
putStrじゃなくてDebug.Trace.traceを挿入する

329:デフォルトの名無しさん
11/05/01 18:05:31.50
MLが活発すぎてとても追いつけそうにない

330:デフォルトの名無しさん
11/05/01 18:11:33.56
>>328
これ、便利ですな

import Debug.Trace

frac :: Int -> Int
frac 0 = 1
frac n = (Debug.Trace.trace (show n) n) * frac (n-1) * (Debug.Trace.trace (show n) 1)

331:デフォルトの名無しさん
11/05/01 18:16:05.34
MLは終わった言語

332:デフォルトの名無しさん
11/05/01 18:16:44.17
>>327
Debug.Traceかな:
URLリンク(www.haskell.org)

基本的な使い方は、
import Debug.Trace
myFunc a b = trace "myFunc" $ a + b
みたいにすれば、myFuncが呼び出されるごとに、myFuncがプリントされる。

ただ、Haskellでは、デバッグするときに、ある関数がいつ評価されるのかにあまり意味はなくって、ある関数の引数と返り値が意図した対応をしているのかが問題になるので、
Debug.Traceのtraceも、関数がいつ評価されたかを確認するよりも、関数の引数と返り値をチェックするために使うように自然になっていくように思う。

それなら、Test.QuickCheckを使ったほうがスマートなんじゃね? と思いつつ、いまでもDebug.Traceユーザーなオレ。

333:デフォルトの名無しさん
11/05/01 19:37:35.71
haskellのメーリングリストっていう意味

334:デフォルトの名無しさん
11/05/01 19:40:23.02
英語のメーリングリストに登録してるけど、メーラーで自動振り分けしてるから、気付いたら30件くらい溜まってて読む気なくす

335:デフォルトの名無しさん
11/05/01 19:55:01.13
俺は去年の8月から購読してるけどほとんど読んでなくてついに未開封1万件を突破した

336:314
11/05/01 23:02:38.55
混乱してきたので、頭を整理するために確認させて欲しいのですが、

take と map の定義がそれぞれ次のものだとします。
(再帰を停止させる条件は省きます)

take n (x:xs) = n : take (n-1) xs
map f (x:xs) = (f x) : map f xs

succ の定義として >>314 の後者を使い、take n (succ 1) の計算で、
x1:x2:x3: ・・・ : (take 0・・・)の形になるまで簡約させるとします。
x1 や x2 自体はまだ評価しません。

この場合において、take や map の左辺を右辺で置き換える(評価する)回数を調べました。
take を置き換える回数を t、map を置き換える回数を m と略記すると、

n t m
1 1 0
2 2 1
3 3 3
4 4 6

2行目は take 2 (succ 1) の場合に take が 2 回、map が 1 回置き換えられるという意味です。
他の行も同様です。

map を置き換える回数は n に対して O(n^2) のオーダーです。
なので、take n (succ 1) を計算するのに少なくとも O(n^2) の計算量は必要になると思います。

しかし実際は皆さんの言われるように O(n) だと思うので、
この考え方は間違っているはずなのですが、何処が間違っているのか分かりません。

337:デフォルトの名無しさん
11/05/01 23:14:18.64
>>336
>326を見たけど、つまづきの原因はここだと思う。
> [11] の左側の ((+1)1) と右側の ((+1)1) が別物にしか思えないです。

グラフ簡約ではこれは同じ物になるということがわかれば、O(m)だと
納得できるんじゃないかな。

ポイントはns = 1 : map (+1) nsの両辺のnsは同じ実体を参照していること。
だから、いくら展開されても実体は常にひとつしかない。


338:314
11/05/02 07:54:24.73
勘違いしているヶ所を絞り込みたいので、
変数が指し示しているものを細かく確認していきます。
ここで、「同じものを指している」という言葉は、
グラフ簡約で同じ対象を指し示しているという意味で使ってます。

succ の定義として >>314 の後者を使い、take 3 (succ 1) の計算で、

take 3 (succ 1)
= take 3 (1 : map (+1) ns)

ここで、2段目の式の変数 ns は
take の第2引数であるリスト 1 : map (+1) ns を 指していますよね。
次に、

take 3 (1 : map (+1) ns)
= 1 : take 2 (map (+1) ns)
= 1 : take 2 (map (+1) (1 : map (+1) ns)

ここで、3段目の式の2つの変数 map は同じ関数を指していますよね。
そして、変数 ns はリスト 1 : map (+1) ns を指している。
次に、

1 : take 2 (map (+1) (1 : map (+1) ns))
= 1 : take 2 (((+1)1) : map (+1) (map (+1) ns))

ここで、2段目の式の変数 ns が指しているものは、
((+1)1) : map (+1) (map (+1) ns) というリストではなく、
1 : map (+1) ns というリストですよね。

まずここまで合ってるでしょうか?

339:デフォルトの名無しさん
11/05/02 09:33:03.55
>>338
あってない。

まず、最初の状態はこのような循環構造になっている。

ns -> 1 : map (+1) ns
     ^----------+

実体をわかりやすくするために、上のmap (+1) nsをns1と表す。
つまり ns = 1 : ns1とする。

簡約は次のように進む。

take 3 (succ 1)
= take 3 (1 : ns1)
= 1 : take 2 ns1

さらに簡約を進めるためにはns1の評価が必要になる。
ns1はmap (+1) nsなので、これを簡約すると
map内のパターンマッチによりnsが先頭(1)と残り(ns1)にわけられ、
先頭には(+1)、残りにはmap (+1)が適用される。

= 1 : take 2 ((+1) 1 : map (+1) ns1)
= 1 : (+1) 1 : take 1 (map (+1) ns1)

後は、この過程の繰り返しとなるので省略。

340:デフォルトの名無しさん
11/05/02 17:58:18.44
>>331
メーリングリストだろ


341:314
11/05/02 21:09:52.35
>>339
その続きをやってみます。

= 1 : (+1) 1 : take 1 (map (+1) ns1)
= 1 : (+1) 1 : take 1 (map (+1) (map (+1) ns))
= 1 : (+1) 1 : take 1 (map (+1) (map (+1) (1:ns1)))
= 1 : (+1) 1 : take 1 (map (+1) ((+1) 1 : map (+1) ns1))

ここで、左側の (+1) 1 は (:) ((+1)1) (take 1 ...) という関数適用の第1引数です。
右側の (+1) 1 は (:) ((+1)1) (map ...) という関数適用の第1引数です。

前者の (:) 関数の第1引数と、後者の (:) 関数の第1引数は、
グラフ簡約で同じものを指しているということですよね。
その理屈が分からないんです。

両者の (+1) という名前がグラフ簡約で
ひとつの同じもの(引数に1を足す関数)を指しているのは分かります。

また両者の(引数である)1 という名前がグラフ簡約で
ひとつの同じもの(1という値)を指しているのも分かります。

しかし、両者の (:) がその第1引数として同じものを指しているのが分からない。

map の定義 map f (x:xs) = f x : map f xs において、
f x という関数適用は引数が x:xs にパターンマッチした後で
毎回新しく生まれませんか?

342:デフォルトの名無しさん
11/05/03 06:54:15.30
>>341
> その続きをやってみます。
>
> = 1 : (+1) 1 : take 1 (map (+1) ns1)
> = 1 : (+1) 1 : take 1 (map (+1) (map (+1) ns))

ここですでに違う。
前回の最後の状態はこのようになっている。

ns -> 1 : (+1) 1 : map (+1) ns1
       ^-------------+

実体をわかりやすくするために、上のmap (+1) ns1をns2と表す。
つまり ns1 = (+1) 1 : ns2とする。

take 1 (map (+1) ns1)の簡約は次のように進む.

take 1 (map (+1) ns1)
= take 1 (((+1)^2 1) : map (+1) ns2)
= (+1)^2 1 : take 0 (map (+1) ns2)

343:デフォルトの名無しさん
11/05/03 12:23:12.26
HaskellスレはPerl忍者が入り込めない結界が張られているのですか?

344:デフォルトの名無しさん
11/05/03 12:52:04.14
構造上言うことができないだけだ。

345:デフォルトの名無しさん
11/05/03 13:07:50.94
むしろ忍者は歓迎だと思われ。
Perlは知らんが

346:デフォルトの名無しさん
11/05/03 13:11:53.06
過疎スレだからな。
Anything is better than nothing.

347:デフォルトの名無しさん
11/05/03 13:18:55.85
>>343
他のスレには蔓延ってるのですか?

348:314
11/05/03 14:35:22.70
>>342
ns は最初 1 : map (+1) ns というリストを指していたのに、
>>339 の最後の段階では 1 : (+1) 1 : map (+1) ns1 というリストを指すように変わったのですね。

しかし、すいません、いつ何故変わったのか理解できていません。

>>339 の簡約の様子を少し丁寧に書き下すと、次のようになります。

[1] take 3 (succ 1)
[2] take 3 (1 : ns1)
[3] 1 : take 2 ns1
[4] 1 : take 2 (map (+1) ns)

ここまでで、まだ ns -> 1 : ns1、つまり ns -> 1 : map (+1) ns ですよね。

[5] 1 : take 2 (map (+1) (1 : ns1))
[6] 1 : take 2 ((+1) 1 : map (+1) ns1)

この、[5]から[6]への map 関数の簡約によって、
ns -> 1 : map (+1) ns から ns -> 1 : (+1) 1 : map (+1) ns1 に変わったのですか?

349:デフォルトの名無しさん
11/05/03 14:48:19.22
そういえばGHCってソースをステップごとにプリコンパイルしたようなコードを出力できなかったっけ?

350:デフォルトの名無しさん
11/05/04 09:31:55.94
>>348
そうそう。
そうなる理由は簡約機械(STG)の仕様の問題だから、
その説明を読めばわかると思う。
逆にソースレベルの等式だけから理解するのは無理。


351:デフォルトの名無しさん
11/05/04 11:11:37.56
STGまで行く前に融合変換等の最適化でlet使う方もベタの定義もなったりしないの?

352:314
11/05/04 11:44:17.29
>>350
おかげさまで、だいぶ核心に近づいた気がします。
2点確認したいことがあります。

ひとつ、最初の質問の式の後者の式が O(n^2) ではなく O(n) になるのは、
Haskell の仕様ではなく、そのコンパイラのひとつである GHC の仕様のためなのですね。
(今時どの実装でもそうなってるという話は置いておいて)

もうひとつ、>>348 の map 関数の適用で ns が指すものが変わるのでしたら、
[2]から[3]への take 関数の適用では ns の指すものは変わらないのでしょうか。


最後に、GHC の STG の仕様を調べてみたいのですが、どれなのでしょうか。
"Implementing lazy functional languages on stock hardware"
という論文ではないですよね。

353:デフォルトの名無しさん
11/05/04 12:42:52.63
お前ら物知りだなぁ

354:デフォルトの名無しさん
11/05/04 13:05:10.84
Haskellで音声認識を400行で書いたという話。
URLリンク(www.furui.cs.titech.ac.jp)
URLリンク(ideone.com)

メイン関数はこんな感じ
main = do
args <- getArgs
case args of
[config, wfstf, spdff, scpf] -> do {
config <- readConfig config;
wfst <- wfstFromFile wfstf config; seq wfst (print (finalSt wfst));
spdfs <- spdfsFromFile spdff; seq spdfs (print (inspectSpdfs spdfs));
scp <- readScpFile scpf;
mapM_ (decodeWfstMain config wfst spdfs) scp
}
_ -> putStrLn "error: husky config wfstf spdff scpf"

355:デフォルトの名無しさん
11/05/04 13:29:21.39
hlintにかけてやったら文句言われそうな括弧の使い方だな

356:デフォルトの名無しさん
11/05/04 13:46:26.39
はしゅけるしゅごい!!
でそれ何に使えるの?

357:314
11/05/04 15:05:53.26
少なくとも「はしゅけるしゅごい」なんて馬鹿にして理解する気の無い人に分かるわけがない
即刻消えなさい

358:デフォルトの名無しさん
11/05/04 16:19:01.07
うちわで盛り上がるのに使える

359:デフォルトの名無しさん
11/05/04 16:33:33.98
正規表現のマッチがボトルネックだった(!)ので
regex-posixをregex-tdfaにしたら爆速でワロタ

360:デフォルトの名無しさん
11/05/04 16:34:27.85
>>354 俺ならこうかな。セミコロンと括弧()とっただけだけど。
main = do
 case getArgs of
  [config, wfstf, spdff, scpf] -> do
   config <- readConfig config
   wfst <- wfstFromFile wfstf config
   seq wfst $ print $ finalSt wfst
   spdfs <- spdfsFromFile spdff
   seq spdfs $ print $ inspectSpdfs spdfs
   scp <- readScpFile scpf
   mapM_ (decodeWfstMain config wfst spdfs) scp
  }
 _ -> putStrLn "error: husky config wfstf spdff scpf"

361:デフォルトの名無しさん
11/05/04 16:43:48.23
素直な人 f (g (h arg))
普通の人 f $ g $ h arg
性格が捻じ曲がった人 f . g . h $ arg

362:デフォルトの名無しさん
11/05/04 17:14:10.03
>>361
:(;゙゚'ω゚'):

363:デフォルトの名無しさん
11/05/04 17:26:17.44
>>361
なんでw
f.g.hを一つの関数に見立ててargを渡してるわけでしょ。
性格曲がってないし、普通だし。

364:デフォルトの名無しさん
11/05/04 17:27:17.32
(\x -> f.g.h x) arg

365:デフォルトの名無しさん
11/05/04 17:28:25.75
>>361
あと、f$g$h argだと再利用性が悪いじゃん。

366:デフォルトの名無しさん
11/05/04 17:33:23.01
arg が IO とかついていた場合だと
f . g . h <$> arg
ってほぼそのままいける
f <$> g <$> h <$> arg
はちょっとしつこい

367:デフォルトの名無しさん
11/05/04 17:50:49.49
>>364 がツッコんで欲しそうにこちらを見てるんだが、どうしようか

368:デフォルトの名無しさん
11/05/04 18:31:09.87
始対象厨: f . g . h . const arg $ ()
プログラム全体を定数にするとなんか嬉しかったりすんのかな?

369:デフォルトの名無しさん
11/05/04 23:14:21.82
>>352
どちらの質問もyes

最後については、その論文でもいいと思う。
最新の実装とは少し違うかも知れないけど、基本的な考え方は同じはず。
説明もわかりやすい。

370:314
11/05/04 23:33:17.54
>>369
おつきあい頂きありがとうございました

結局この論文しか見当たらなかったので今読んでいる最中です

371:デフォルトの名無しさん
11/05/05 00:57:49.19
isInfixOfってStringだと順番にしらべていくだけなんだね
ByteStringだとKMPだった

372:デフォルトの名無しさん
11/05/05 03:46:33.93
>>370
Haskellの仕様には載ってないとはいえ、
「サンクの内容は一回しか評価されない」
というルールを満たす処理系ならどれでも同じ計算量になるよ

紙の上でグラフ簡約を追いかけるだけで十分理解できる内容で、
STG論文はこの話に関係ない詳細が多すぎて明らかな遠回りだと思う

373:デフォルトの名無しさん
11/05/05 03:51:07.29
ghc -fext-core で確認すれば一発だと思います


374:デフォルトの名無しさん
11/05/05 03:53:51.09
いやCoreを見たって構文糖を削ぎ落とされたソースが出てくるだけだろ

375:デフォルトの名無しさん
11/05/05 04:07:54.56
>>374
構文糖を取る以外にも、ものすごく変な最適化してる


376:314
11/05/05 09:40:06.90
>>372
ノートに何度も図を描いて簡約の様子を考えてみたのですが、
どうしても理解できませんでした

377:デフォルトの名無しさん
11/05/05 14:49:38.05
俺スクリプトの一行目が#! /usr/bin/runghc ばっかりになってきた

378:デフォルトの名無しさん
11/05/05 15:01:02.12
>>377
そのまま、全てのコマンドがhaskellで書かれたThis鳥作って出してくれ


379:デフォルトの名無しさん
11/05/05 19:07:39.49
30行くらいの書き捨てプログラムをコンパイルして
バイナリのサイズが12MBとかになるとがっかりする

380:デフォルトの名無しさん
11/05/05 20:10:04.48
書き捨てプログラムなのにバイナリの大きさが重要なの?

381:デフォルトの名無しさん
11/05/06 00:29:45.44
バイナリのサイズが小さくならないのは、Haskellの仕様の問題なのか、GHCの最適化手法がウンコだからなのか
それともバイナリのサイズにこだわることがウンコなのか


382:デフォルトの名無しさん
11/05/06 00:32:40.48
性的リンクだからじゃね

383:デフォルトの名無しさん
11/05/06 00:46:03.33
main = return () だけだと 847K (strip すると 584K) だけど
単純に gtk hxt regex-tdfa haskeline parsec を import するだけで 36M (strip後20M) に膨れ上る

384:デフォルトの名無しさん
11/05/06 01:03:03.16
逆に言うと、コンパイルしたらexeファイルだけ持っていけばOKってこと?


385:デフォルトの名無しさん
11/05/06 01:07:44.26
>>384
はい


386:デフォルトの名無しさん
11/05/06 04:28:24.87
バイナリのサイズを小さくしたかったらFFI


387:デフォルトの名無しさん
11/05/06 05:39:16.69
ghcのデフォルト設定って静的リンクなのかよw

388:デフォルトの名無しさん
11/05/06 05:40:48.10
あ、よく考えたらマイナー言語の場合はそっちの方が都合がいいのかもな
軽量な書き捨てプログラムはrunghc使えばいいし

389:デフォルトの名無しさん
11/05/06 10:24:17.78
使うかどうか解らないからライブラリをダイナミックリンクするんじゃないの?
コンパイル時点で何を使うかはっきりしてるんだから静的リンクじゃん?

390:デフォルトの名無しさん
11/05/06 10:29:53.98
ごめんなんでもない

391:デフォルトの名無しさん
11/05/06 12:15:03.41
実行ファイルでかいなあと思ってたがそういうことか

392:デフォルトの名無しさん
11/05/06 19:27:33.82
ただでさえ重いHaskellが仮想機械上で動くようになったら
Javaどころの贅肉じゃなくなるな

393:デフォルトの名無しさん
11/05/06 19:32:41.25
Javaはポータブルなバイトコードだから思い
ネイティブなバイトコードを仮想機械で動かせばそれなりに早くなると思う

394:デフォルトの名無しさん
11/05/06 19:53:13.15
何の話でしょう?llvm?

395:デフォルトの名無しさん
11/05/06 20:02:21.76
>>392
実行速度とサイズは反比例するんですが。。。
まあ、理屈で言えばhaskellがc言語並に速くなるには、もっとサイズがデカくなる必要がある訳で

参照透明性が有るって事は、究極の最適化は、同じ関数に同じ引数が与えられたら、2度目以降は計算すっ飛ばして値が帰ってくるようにする事

実行された全ての関数の、全ての引数に対応した値が保持されるのが、究極の最適化

いくらメモリが有っても足りないから、現在の実装はそう言う実装じゃ無いだろうけどね

64bitOS向けに最適化進んだら、そう言う日も来るかもしれない



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch