関数型プログラミング言語Haskell Part6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/07(火) 21:24:26http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
関連スレは>>2
関連書籍は>>3
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0423デフォルトの名無しさん
2007/01/03(水) 12:48:55プログラミング指向の論文を読んでいると、
引数または返値に"IO a"を含むものをfunctionとは呼ばずにactionと呼んでいる事が多いので、
そう書いたんだよ。
0424デフォルトの名無しさん
2007/01/03(水) 12:50:080425デフォルトの名無しさん
2007/01/03(水) 13:05:45代入ではないんですね。
どうも混乱してしまって・・・
cでいう
# include <stdio.h>
int main (void)
{
int y = 0;
y = sqare(3);
printf("%d\n",y);
}
int sqare (int n)
{
n = n*n;
return n;
}
のn = n*n;とは別なんですよね?
0426デフォルトの名無しさん
2007/01/03(水) 13:10:07IOっていうのが味噌なんですね。
それとcのプログラム、関数宣言してないですけど、許してください。
0427デフォルトの名無しさん
2007/01/03(水) 13:41:21意味的には似てるけど、
たとえば、Cではsquare(2)とすれば、それがその場で実行されて4という値として扱われるけど、
Haskellでは(square 2)そのものとして扱います。
まず、IO a -> a という事はできません(IOがいったんくっついたら取り外すことはできないの)ので、
Haskellではmainを評価することで実行されますが、
最終的にはmainまで … -> IO aというのを続けて書いていかないとダメなの。
main関数の型は main :: IO () ですよね。
0428デフォルトの名無しさん
2007/01/03(水) 13:42:50square n = n * n
に近い書き方は、
int square(int n) { return n*n; }
だね。
逆に、
int sqare (int n) { n = n*n; return n; }
に近いのは
square n
= let m = n * n
in m
0429デフォルトの名無しさん
2007/01/03(水) 22:39:29main = do func 1
これ ghc だと通ったんですけど、この場合の func の型は何ですか?
0430デフォルトの名無しさん
2007/01/03(水) 23:54:510431デフォルトの名無しさん
2007/01/04(木) 00:50:26よく参照されるやさしい Haskell 入門ですら、
関数自身の事を表す事もあれば、値を表す事もあるんだよな。
http://www.sampou.org/haskell/tutorial-j/io.html
例えば、7.1 の最初の文
>各 I/O のアクションはそれぞれ値を返します
は関数自身をアクションと呼んでるように見えるし、
その直後の
>これはアクションを他の値と区別するためです
は値をアクションと呼んでるように見える。
どちらもアクションと呼ぶのか、それともいい加減なだけなのか。
どっちなんだろ?
>>425
square n が n * n と等値。
無意識に square と n の間に理解の区切りを設けてるみたいだけど、
そんなものはないと考えた方がいい。
0432425
2007/01/04(木) 16:24:19square n = n*nは理解できました!
関数squareは仮引数nを一つとる関数で、その本体はn*nという理解でよいんですね。
関数とアクションの違いは、まだ勉強不足で理解は出来ていないですけど、
IOが味噌なのは分かりました。
話は変わりますけど、文字列が文字のリストなんて、HaskellはCみたいですね。
0433デフォルトの名無しさん
2007/01/04(木) 18:40:300434デフォルトの名無しさん
2007/01/05(金) 14:06:19すいません、配列とリストって何が違うのでしょうか?
調べてみたんですが良く分かりませんでした。
例えば
# include <stdio.h>
int main (void)
{
char *string = { "Hello"};
printf("%c\n",string[2]);
return 0 ;
}
みたいにリストって言うのは、配列とポインタの組み合わせとその操作と思っていたんですけれど
違うのでしょうか?
0435デフォルトの名無しさん
2007/01/05(金) 14:27:300436デフォルトの名無しさん
2007/01/05(金) 15:04:12Haskellでいうリストは「単方向リンクリスト」のこと。
0437デフォルトの名無しさん
2007/01/05(金) 15:41:320438デフォルトの名無しさん
2007/01/05(金) 16:05:390439デフォルトの名無しさん
2007/01/05(金) 16:08:13実際のリストは、こんな感じのデータ構造を
適当につなぎ合わせて作られている。
struct Object {
enum {PAIR, INTEGER, STRING} type;
union {
struct {struct Object *head, *next;} pair;
int integer;
char *string;
} body;
};
0440デフォルトの名無しさん
2007/01/05(金) 16:09:53http://www.metabolome.jp/ja/biochem/bioinfo/list.pdf/view
0441デフォルトの名無しさん
2007/01/05(金) 16:21:40それは余りに違いすぎないか?
型タグはない実装が多いだろうし、その定義だと遅延しない。
0442デフォルトの名無しさん
2007/01/05(金) 16:24:430443デフォルトの名無しさん
2007/01/05(金) 16:39:23頭の中のモデルとしてはこれで十分。
っていうか、実装の話をしだしたらキリがないだろ
0444デフォルトの名無しさん
2007/01/05(金) 16:58:38わざわざ型タグを含めたObject型を持ち出しているから、実装に忠実な
データ構造を提示しているつもりかと思った。
>頭の中のモデルとしてはこれで十分。
遅延を考慮しないなら十分だろうが、そういう単純化した
モデルとしてなら無駄が多くないか?
struct node
{
void *head;
struct node *tail;
};
で十分だと思うが。
0445デフォルトの名無しさん
2007/01/05(金) 17:18:17文字列とかの "本物のデータ" が
どう収まるか説明しないと、
普通はイメージが湧かない思う。
まぁ、その判断は >>434 に任せるが・・・
0446デフォルトの名無しさん
2007/01/05(金) 17:28:410447デフォルトの名無しさん
2007/01/05(金) 17:47:170448デフォルトの名無しさん
2007/01/06(土) 14:36:31でも何でこれってあちこちIO付きなの?
0449デフォルトの名無しさん
2007/01/06(土) 18:59:17なぜData.Mapみたいなインタフェースじゃないか、という疑問なら、効率の問題。
Data.Mapのようなインタフェースだと、配列に操作(たとえばinsert)を施した後、
操作前の配列と操作後の配列の両方を操作しえるので、この二つを別々に
保持しておかないといけない。(ナイーブには毎回コピーをとればよい。
もっと低コストな方法もあるだろうが、いずれにせよオーバーヘッドがある)
実際Data.HashTableのようなIOの絡んだインタフェースなら、
常に最新版しか操作できないので、単純なメモリ上の破壊的操作で実装できる。
なぜSTじゃなくてIOなのかという疑問なら、俺にも判らん。
0450448
2007/01/06(土) 23:35:56ども。Haskell初学者なので処理系の中の人の気持ちはあまりわからんけど、
破壊的操作を用いて実装すれば実行時効率がよいことは理解できる。ありがとう。
STってのはControl.Monad.STのこと?
GHC付属文書での記述を軽く眺めてみたけど、さぱーりだった…
で、便乗して別の質問。Data.Map的なインタフェースを持つ型について。
その型の変数xがあって、内容を一部変更した値を変数yに格納して、
変数xの内容を完全に破棄したとき、「いつでも全体をコピーしたりはしない」
ことはわりと期待してもよいもの?
0451デフォルトの名無しさん
2007/01/07(日) 11:37:43感謝の言葉が遅くなってしまい申し訳ありません。
>>439,444
実際のコードの提示、有難うございます。
>>435,436,437,438,440,441,442,443,445,446,447
ご助言有難うございます。
リストの事はC言語による最新アルゴリズム辞典という本を買ってきて解決しました。
もうひとつ質問です。
文字のリストと文字列の事についてなのですが、
Haskellではこの二つは全く同じで
ある関数がstringを引数にとるなら文字列として扱われて、
[char]を引数にとるなら、文字のリストとして扱われる、
という理解でよいのでしょうか?(ふつうのHaskell、p68から質問です。)
0452デフォルトの名無しさん
2007/01/07(日) 11:38:11なんとか良いプログラミングスタイルないですか?
0453デフォルトの名無しさん
2007/01/07(日) 11:39:430454デフォルトの名無しさん
2007/01/07(日) 11:39:54中身では、
type String = [Char]
ということになってるのかな。
だから、Stringも[Char]も同じ。
0455デフォルトの名無しさん
2007/01/07(日) 11:45:58そういう場合って、SICPで勧めているプログラミングスタイルだと二度手間になってしまいますよね。
0456デフォルトの名無しさん
2007/01/07(日) 11:58:00unsafePerformIOでIOを外しちゃえばいい。
0457デフォルトの名無しさん
2007/01/07(日) 12:23:20最初から上位の関数にIOをつけておけば良い。
0458デフォルトの名無しさん
2007/01/07(日) 13:03:05たとえば、設定ファイルの読み込みとかの用途だとそれでも良いかもしれないが、
unsafePerformIOだと実行順序が規定されなくなってしまうでしょ?
>>457
すべての関数にIOをつけると、ものすごく再利用しにくくて汚いコードになると思うのですが・・
0459デフォルトの名無しさん
2007/01/07(日) 13:12:29全体として実行順序が規定されていなきゃいけない処理なら
IOが必要な部分だからそのままでいいのでは。
0460デフォルトの名無しさん
2007/01/07(日) 13:53:54ライブラリの関数や、部品としての再利用を目的とした関数なら、
将来にわたって入出力をしないと確信を持って言えることがおおいだろうから、
そういう場合にはIOなしで問題ない。
逆に、部品としての再利用性よりも変更に強いことが求められる部分
(アプリケーションのなかで比較的上位の(mainに近い)部分とか)は、たとえ現時点で入出力が
絡まないとしても、IOをつけておいて損はないと思う。
0461デフォルトの名無しさん
2007/01/07(日) 14:07:09>STってのはControl.Monad.STのこと?
そう。IOと同様にメモリ操作のできるモナドだけど、
IOと違って入出力には使えず、その代わりrunSTを使って外せる。
>ことはわりと期待してもよいもの?
なんともいえない。
たとえばtailはコピーを一切しないで実装されてる
(結果のリストと元のリストは完全に共有される)し、
Data.Map.insertの結果も大部分を元のmapと共有する。
一方で、initはリスト全体をコピーするし、Data.Array.Array
ではすべての変更操作ごとに配列全体がコピーされる。
(効率のために、なるべくたくさんの操作を一回にまとめて適用できるようになっているけど)
0462デフォルトの名無しさん
2007/01/07(日) 14:42:41モナドより使いやすいものは無いものだろうか。
0463デフォルトの名無しさん
2007/01/07(日) 16:04:080464デフォルトの名無しさん
2007/01/08(月) 01:14:53Data.Array は書き換えのたびに全体をコピーしている。ただし MArray を使えばモナド操作で一部の書き換えが可能。
リストの init はコピーを発生するが、 ByteString の init は定数時間でコピーを発生させない。
Data.Sequence はそれなりの償却コストがかかる。
というようにデータ構造によってそれぞれ違うから、「ドキュメントを読みなさい」というのが正解。
下位の関数の出力がIOでも、それに fmap で純関数を適用すればいいのでは。
綺麗に書きたいなら Control.Applicative が使えるかもしれない。
0465デフォルトの名無しさん
2007/01/08(月) 16:36:54可能なら、どうやったらよい?
知りたいのは、実行したプログラムのどこにどの程度の処理時間がかかっているか、
各関数は何回評価されたか、ってあたり。トータルじゃなくて内訳を見たい。
0466デフォルトの名無しさん
2007/01/08(月) 17:19:06GHCを使ってるなら、-prof -auto-all付きでコンパイルして、
できた実行ファイルを+RTS -p付きで実行すると、
<実行ファイル名>.profというファイルにプロファイル結果が出力される。
詳しくはGHCのユーザガイドを読んでくれ。
0467デフォルトの名無しさん
2007/01/08(月) 17:26:45例:
ghc --make hoge.hs -o hoge.exe -prof -auto-all
hoge +RTS -p
type hoge.prof
Gtk2Hsのサンプルで.profファイルのビュアーがあるみたいね。
http://sourceforge.net/project/screenshots.php?group_id=49207&ssid=5881
0468デフォルトの名無しさん
2007/01/08(月) 22:34:49thx。
ユーザガイドのまるまる1章がProfilingなのね。
ざっと眺めただけだけど、heap profilingなんかは使い込むと便利そうだ。
まずは書いてもらった基本操作から使ってみるよ。
0469デフォルトの名無しさん
2007/01/10(水) 11:02:23Haskellでは空リストがリストの終わりを表すと聞きました。
では、map関数を使って空リストに関数を適用させることは出来ないのでしょうか?
0470デフォルトの名無しさん
2007/01/10(水) 11:11:25実際に組みながら覚えるのが良いんだろうけど・・・
自分としては最終的にはモナディウスみたいなゲームを作ってみたいのですが
グラフィックを扱うプログラムって、初心者には敷居が高いんですかね?
初心者がHaskellを覚える為に組むとしたら、どんなものがオススメですか?
抽象的ですみませんが、皆さんがどんなプログラム組んで覚えたかでもよいので教えてください。
0471デフォルトの名無しさん
2007/01/10(水) 11:23:59空リストがリストの終わりを表すのではなくて、空がリストの終わりです。
プログラミング的には空リストをリストの終わりとして処理しています。
空に関数を適用できません。
>>470
グラフィックスを扱うのはIO周りの事がよく理解できていれば可能だと思います。
0472デフォルトの名無しさん
2007/01/10(水) 11:25:500473デフォルトの名無しさん
2007/01/10(水) 11:28:370474デフォルトの名無しさん
2007/01/10(水) 11:28:40ゲームプログラミングには Haskell は向いてないと思う。
>469
それくらいやってみりゃいいだろ。なんでいちいち聞くの。
Prelude> map id []
[]
というかなんで出来ないと思うのかがわからん。
0475デフォルトの名無しさん
2007/01/10(水) 11:32:07>空に関数を適用できません。
これはひどい。
0476デフォルトの名無しさん
2007/01/10(水) 11:33:32だったら空リストじゃなくて空に関数適用するようなHaskellコード書いてミロや!!!!
0477デフォルトの名無しさん
2007/01/10(水) 11:47:52あんたの空と空リストの定義がおかしいだけ
空リストは空そのものとして定義される。これは仕様書にもある。
0478デフォルトの名無しさん
2007/01/10(水) 12:53:52回答有難うございます。
結局空のリストに関数適用はできるという理解でよいのでしょうか?
Prelude> map id []
[]
このidという関数はどういう定義なのでしょうか?
また、
Hugs> map id [[],[],[]]
[[],[],[]]
という事も出来たのですが、この場合map関数は
「空リストのリスト」の最後に空リストがもう一こ上のレベル?で有るから
「空のリストのリスト」は終わりと判断して再帰を終わらせるという理解で良いでしょうか?
0479デフォルトの名無しさん
2007/01/10(水) 13:37:57まぁいいから外にでて空を見上げてみろ、今日は良い天気だ、「のどか」って書いてないか?
0480デフォルトの名無しさん
2007/01/10(水) 14:09:220481デフォルトの名無しさん
2007/01/10(水) 14:34:16「屋外にでて上を見上げて」なら推論可能?
0482デフォルトの名無しさん
2007/01/10(水) 15:33:24idとmapの定義は
id :: a -> a
id x = x
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
この定義に従って、
map id [[],[],[]]
=> map id ([] : [[],[]])
=> id [] : map id [[],[]]
=> [] : map id ([] : [[]])
=> [] : (id [] : map id [[]])
=> [] : ( [] : map id ([] : []) )
=> [] : ( [] : ( id [] : map id [] ) )
=> [] : ( [] : ( [] : [] ))
=> [] : ( [] : [[]] )
=> [] : [[], []]
=> [[], [], []]
のように計算される。
0483デフォルトの名無しさん
2007/01/10(水) 16:34:21そんな記述はどこにもない。
あるというならどの文献のどのページにあるのか言ってみろ。
0484デフォルトの名無しさん
2007/01/10(水) 16:42:380485デフォルトの名無しさん
2007/01/10(水) 17:49:05すみません、
Prelude> map succ [1,2,3]
[2,3,4]
を実行するとちゃんと実行できるんですけど、
Prelude> map succ [[],[],[]]
<interactive>:1:4:
No instance for (Enum [a])
arising from use of `succ' at <interactive>:1:4-7
Probable fix: add an instance declaration for (Enum [a])
In the first argument of `map', namely `succ'
In the definition of `it': it = map succ [[], [], []]
を実行するとあまりうれしくない結果が出てきます。
どうしてですか?[]は何型なのでしょう・・・
0486デフォルトの名無しさん
2007/01/10(水) 17:51:370487デフォルトの名無しさん
2007/01/10(水) 17:55:36> square n が n * n と等値。
ええ?!じゃあ、たとえば、
test :: Int -> Int
x * x = test x
ってコンパイル通るんですか?!
0488デフォルトの名無しさん
2007/01/10(水) 19:57:43>どうしてですか?[]は何型なのでしょう・・・
結局の所、map succ [[], [], []] = [succ [], succ [], succ []]だから、
そのエラーはsucc []を実行しようとして失敗したってこと。
なんで失敗するかと言えば、succの引数はEnumクラスのインスタンスじゃないとダメなのに
[] は [a]型でEnumクラスのインスタンスではないから。
HugsとかGHCiでは関数とか値の型は :t 〜 って入力すればわかる。
例えば map succ の型を知りたい時は、
Prelude> :t map succ
map succ :: Enum a => [a] -> [a]
0489デフォルトの名無しさん
2007/01/10(水) 20:06:26mapsucc :: [Int] -> [Int]
mapsucc lst = map succ lst
試しに、上のようなコードを書いてみました。
mapsucc [1,2,3]
を実行すると、
[2,3,4]
のように表示されました。
ここまでは良いのですが、
mapsucc [[],[],[]]
を実行すると、
<interactive>:1:9:
Couldn't match `Int' against `[a]'
Expected type: Int
Inferred type: [a]
In the list element: []
In the first argument of `mapsucc', namely `[[], [], []]'
と表示されました。
おかしいですよね、これって。
0490デフォルトの名無しさん
2007/01/10(水) 20:08:470491デフォルトの名無しさん
2007/01/10(水) 20:11:37[[], [], []] :: [Int] であるためには [] :: Int でないといけない。
だけど[]は[a]であってIntではない。よって型の不一致(Couldn't match `Int' against `[a]')
0492デフォルトの名無しさん
2007/01/10(水) 20:22:32空の型は総称的定義されているべきだと思うんですけど。
上のコードでは
mapsucc :: [Int] -> [Int]
のように明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
0493デフォルトの名無しさん
2007/01/10(水) 20:35:27> 明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
その理屈でいくと、[] + 1 :: Intとか1 + [] :: Int って書いたら
なんか適当なInt型の値が得られなきゃいけないって事?
0494デフォルトの名無しさん
2007/01/10(水) 20:40:391+[]なんて定義できないよね。そう思うよね?
だから、空は抽象的なものであって、Haskellの仕様では、空リストと空は別ものなのです。
0495デフォルトの名無しさん
2007/01/10(水) 20:58:04おそらく
[1,2,3] = 1 : [2, 3] = 1 : ( 2 : [3] ) = 1 : ( 2 : ( 3 : [] ) )
と分解できるから[]が終端なんだと言ったんだろうけど、
これは単に空リスト[]の先頭に3, 2, 1を順に追加していったものがリスト[1,2,3]だってこと。
もしくは、(有限)リストから先頭を取り除く操作をしていった場合、空リスト[]に行き着いた時点でそれ以上先頭を取り除くことが出来なくなるってこと。
0496デフォルトの名無しさん
2007/01/10(水) 21:22:15ただ、リストの要素として[]がリスト[1,2,3]の終わりに入っていると考えるのは間違い。
0497デフォルトの名無しさん
2007/01/10(水) 21:31:430498デフォルトの名無しさん
2007/01/10(水) 22:44:010499デフォルトの名無しさん
2007/01/10(水) 22:55:26本当の集合って何?
0500469
2007/01/10(水) 22:57:09>>495
すいません。「Haskellでは空リストがリストの終わりを表す」とは書いてないです。
やさしいHaskellのp36に
「空リストは特別な値で、リストの末尾に現れます」とあります。
で、自分が「C言語の文字列でいうところのヌル文字みたいなものだ」と
勝手に解釈したんです。
で、
「map関数で何かのリストに適当な関数を適用するとき、
リストの終端を判定するとき空リストがあれば、
再帰を打ち切る」んだなと思ったんです。
もし曲解している点があれば、指摘してください。
0501デフォルトの名無しさん
2007/01/10(水) 23:14:43Haskellのリストは単方向リスト。
Cの文字列みたいに何らかのターミネータを持つ配列じゃない。
struct LIST{void*value;struct LIST*next;};
Cで言うと(struct LIST*)NULLが空リスト。
要するにHaskellはnextの値が空リストかどうかで終端を判断している。
君はvalueが特殊な値('\0')のときに終端になるのだと勘違いしている。
と、説明書いてみたけど、うーん自分でもこれじゃあ分かりくいな。どうかけばいいだろう。
0502デフォルトの名無しさん
2007/01/10(水) 23:34:08enum Tag { NIL, CONS };
struct Nil { Tag t; };
struct Cons { Tag t; void *head; union List *tail; };
union List { struct Nil nil; struct Cons cons; };
という感じでないか
0503デフォルトの名無しさん
2007/01/11(木) 03:18:200504デフォルトの名無しさん
2007/01/11(木) 06:47:50Cons → 1
↓
Cons → 2
↓
Nil
というような構造になっていて、Haskellコードではこれを 1:(2:[])
と表現しています。 [] はこの場合の Nil のことを表す記号です。
いちいち 1:(2:(3:(4:[]))) と書くのは面倒なので
[1,2,3,4] と書いてもよくて、これは 1:(2:(3:(4:[]))) と解釈されます。
さて、map f という関数は、関数 f をこの Cons の右側につながった値に
それぞれ適用する関数です。
したがって、上の 1:(2:[]) に map f を適用した結果は
Cons → f 1
↓
Cons → f 2
↓
Nil
となります。
map f を [] に適用するとどうなるかというと、 [] は
Nil
という構造なのでfを適用する値が一個もなく、したがって結果は
Nil
のままです。よって map f [] の結果は [] となります。
0505デフォルトの名無しさん
2007/01/11(木) 21:57:46SICPって読んだほうがいい?
0506デフォルトの名無しさん
2007/01/11(木) 22:08:52目的による。
何がしたいの?
0507デフォルトの名無しさん
2007/01/11(木) 22:36:40最近寝付きが悪いので…
0508デフォルトの名無しさん
2007/01/11(木) 22:39:11読むことを激しく勧める
0509デフォルトの名無しさん
2007/01/11(木) 22:47:17この手の専門書は、原書より訳本の方がいいよね?
へんてこな翻訳文体が心地よい眠りに誘うと期待
0510デフォルトの名無しさん
2007/01/11(木) 22:52:09よほどスラスラ英語を読めるのでもなければ
そんな訳でも訳の方がマシだと思う。
少なくともSICP程度の訳であれば。
0511デフォルトの名無しさん
2007/01/11(木) 22:54:46へんてこなのには違いないんだけど、なんか勝手に訳語作っちゃったり、痛さあふれる訳本です。
0512デフォルトの名無しさん
2007/01/11(木) 23:11:240513デフォルトの名無しさん
2007/01/11(木) 23:20:11偉い人が作って、みんながそれが正しいと思って使うようになるんだけど、
誰もその人の訳語を使わないし、そもそも新しい訳語を作れるほど自分は偉いんだ、
と思いこんでる身の程知らずのタコだから痛いんですよ。
0514デフォルトの名無しさん
2007/01/12(金) 20:49:230515デフォルトの名無しさん
2007/01/12(金) 21:14:22ただ議論がしたいからここを利用しているだけで、
なくなれば別のところにいくだけです。
0516デフォルトの名無しさん
2007/01/12(金) 21:24:320517デフォルトの名無しさん
2007/01/12(金) 21:35:57で良いんじゃねぇ?
もしくはHaskellで適当な掲示板作るとか。
出来ないかな。
俺は2ch潰れて欲しいな。
人文科学の観点から、これほど大きい掲示板が潰れると
どういう影響が出るか見てみたい。
まるで夕張が国の実験場になるように。
0518デフォルトの名無しさん
2007/01/12(金) 21:57:27個人的な立場で言うと、まじめにGoogle無くなるよりも困る
0519デフォルトの名無しさん
2007/01/12(金) 22:11:42ただ、専ブラの発明は偉大であると思ったので、
この方式自体は生き残るだろう。
ブログってRSSフィードを出力するのが増えてるけど、
専ブラで読める形式を出力するのってどうね?
とブログスレで提案したんだが、だれも作ろうとしない。
ああ、スレ違い
0520デフォルトの名無しさん
2007/01/12(金) 22:27:13無くて済むのならない方が良い。絶対に良い。
0521デフォルトの名無しさん
2007/01/12(金) 22:36:482chを毎日見る人間ってけっこう多いと思うぞ
インターネットと2chが1:1になるくらい
となるとブラウザと2chブラウザはわけて存在したほうがスッキリする
0522デフォルトの名無しさん
2007/01/13(土) 03:20:14文字
文字列
文字のリスト
文字列のリスト
の実感がイマイチわからねぇ。
関数の引数の型によって、文字のリストが文字列になったりその逆になったり
う〜ん。
あと、質問なんですけれども
多相型と型変数ってどこがちがうのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています