トップページtech
1001コメント379KB

関数型プログラミング言語Haskell Part6

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2006/11/07(火) 21:24:26
haskell.org
http://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の仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0830デフォルトの名無しさん2007/02/19(月) 21:20:57
>>826
モナド (F,η,μ) で,特に F を明示したい場合に "monad over F" という
言い方をすることがあるので,それほど変ではないと思うよ.
0831デフォルトの名無しさん2007/02/19(月) 21:34:40
「圏論の基礎」と格闘中…
こういう話に追いつけるのはいつになることやら。
0832デフォルトの名無しさん2007/02/19(月) 22:05:34
>>829
!!!
マジで!ちょっとまてわからん。orz
orz
0833デフォルトの名無しさん2007/02/19(月) 22:09:08
>>828

あー。早とちり。

>のIOが、何かの左 or 右随伴になってるってこと?

そういう意味じゃない。どういう意味かと聞かれたら
そこを現在勉強中です。
うまく答えれません。正直そんなナチュラルに答え返されるとは思わなかった。
0834デフォルトの名無しさん2007/02/19(月) 22:16:50
>>833
モナドと随伴は一対一対応する.
(随伴が与えられると,そこからモナドが構成できる.逆に,
 任意のモナドに対して,それを構成するような随伴が存在する)
よって IO に対してそれに対応する随伴があるのは当然.

ということを言おうとしてると思って,IO の随伴を求めたけど
全然直感的でないものしか得られなかった.

これって何か解釈あるのかな? 参考文献お願いします.
08358332007/02/19(月) 22:18:07
ちょっと即興で考えて見ます。
ちょうどそれを考えられる材料がそろってきたので。
期待しないでください。
0836デフォルトの名無しさん2007/02/19(月) 23:30:53
圏論とチューリングマシンやラムダ論法って、同じ記述力なの?
それともどれかがより大きな記述力があるの?

なんで圏論なのさ?チューリングマシンでは駄目なのかよ!

チューリングがホモだからって差別してんじゃないわよ!
0837デフォルトの名無しさん2007/02/20(火) 00:02:47
>>831
コンマ圏がマンコ圏に見えて困るでしょ?
0838デフォルトの名無しさん2007/02/20(火) 01:50:36
>>834
モナドを構成する随伴は一般に複数あってそのうちの一方の端が Eilenberg-Moore の
構成でもう一方の端が Kleisli の構成、だよね。
端というのはある圏の始対象と終対象という意味で。
0839デフォルトの名無しさん2007/02/20(火) 02:46:29
10年間はlispが最強だったみたいですが
今の最強はhaskellでしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
この人達が絶賛するlispのマクロに対応する機能も
haskellは持ってるのでしょうか?
0840デフォルトの名無しさん2007/02/20(火) 02:49:25
10年間 -> 10年前
0841デフォルトの名無しさん2007/02/20(火) 14:18:13
>>839
Haskellにはマクロはない。
Lispのことは良く知らないけど、記述力という点で
Haskellより弱いとは思えない。
0842デフォルトの名無しさん2007/02/20(火) 14:55:20
手続き型言語の方が記述力は高いもんな
0843デフォルトの名無しさん2007/02/20(火) 15:35:07
手続き型かどうかは関係なくね?
第一級の関数とかマクロとかパターン照合とかが使えるかどうかが大きいと思う。
0844デフォルトの名無しさん2007/02/20(火) 16:14:12
>>843
それは記述力とは関係なくて、エラー抑制の効果があるだけ。
0845デフォルトの名無しさん2007/02/20(火) 18:53:11
記述力ってのは型システム(の緩さ)で決まるのですよ。
その結果、Lispの方がちょっとHaskellよりも記述力が高いのですよ。

でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
0846デフォルトの名無しさん2007/02/20(火) 19:30:22
冷静に考えてみると、動的型言語と同等の力が必要ならいつでも
Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
0847デフォルトの名無しさん2007/02/20(火) 20:01:39
>>844
マクロをエラー抑制だけと言い切るのはちょっとw
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ae%e5%8a%b9%e7%94%a8
0848デフォルトの名無しさん2007/02/20(火) 20:04:38
どこでもevalれないと同等とは言いたくないぜ。
メタな要素がまざると、型とか意味論的に都合が悪いのかな
0849デフォルトの名無しさん2007/02/20(火) 22:41:56
つ hs-plugins
0850デフォルトの名無しさん2007/02/20(火) 22:43:04
ああ、まあ hs-plugins の eval は IO だから「どこでも」じゃないな
0851デフォルトの名無しさん2007/02/20(火) 23:01:37
HaskellのevalはIOとして外側の世界に出して行うしかない。
LispのevalはLispの世界で定義されている。
この差は大きいと思う。
0852デフォルトの名無しさん2007/02/20(火) 23:02:53
動的なプログラムはデバッグきつい。
性的なほうがいいね!
0853デフォルトの名無しさん2007/02/20(火) 23:11:08
最初はきついかも知れんが、動いていればだんだん滑らかになるよ。
きつい方が気持ちよい
0854デフォルトの名無しさん2007/02/24(土) 00:52:28
>>831
圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
0855デフォルトの名無しさん2007/02/24(土) 01:58:15

これから初心者の俺が朝まで生Haskellやろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
08568552007/02/24(土) 06:05:17
終了しますた
0857デフォルトの名無しさん2007/02/24(土) 09:34:02
>>855-856
ワロタ
0858デフォルトの名無しさん2007/02/24(土) 17:37:24
855≠856
だってだれもレスくれねーんだもん
バベル見て寝たわ
0859デフォルトの名無しさん2007/02/24(土) 18:05:10
>>858
夜中の2時にいきなりでレスも糞もねーだろw
VIPじゃねーんだぞwwww

昼間に犯行予告をしとけよ
0860デフォルトの名無しさん2007/02/24(土) 18:43:30
犯行予告は犯罪だからその教唆も明らかに犯罪ですね。
0861デフォルトの名無しさん2007/02/24(土) 19:01:36
アスペルガーの馬鹿はすっこんでろ!
0862デフォルトの名無しさん2007/02/25(日) 02:59:15

             ∩___∩
             |ノ⌒  ⌒ ヽ
             / ●)  ●) |
        Let's  |   ( _●_)  ミ  Haskell♪
            彡、  |∪| 、`
              /  ヽノ  ヽ
             / 人    \\   彡
           ⊂´_/  )    ヽ__`⊃
                / 人 (
               (_ノ (_)
0863デフォルトの名無しさん2007/03/03(土) 00:14:49

 い ま か ら ハ ス ケ る か ら お し え て く れ
0864デフォルトの名無しさん2007/03/03(土) 00:36:30
なんでも聞きなさい。
0865デフォルトの名無しさん2007/03/03(土) 00:41:35
よーし、じゃあまだ「ふつうのHaskellプログラミング」で
Map関数までしかすすんでないんだけど、
いきなりWikiつくりはじめちゃうぞーー
0866デフォルトの名無しさん2007/03/03(土) 01:00:05
>>865
ちょwwwそれ無謀wwwwwww
0867デフォルトの名無しさん2007/03/03(土) 02:24:52
はははは 父さん元気な子は大好きだぞー
0868デフォルトの名無しさん2007/03/03(土) 02:29:12
いやーだってね
基礎を勉強したところでコードは書けるようにならないじゃない
なんか作ろうとしたほうが5倍くらい早くおぼえれる

そうだろ?父さん!
0869デフォルトの名無しさん2007/03/03(土) 02:54:28
>>868
君が一番上達する方法はしらないから、自由にすればいいよ。
0870デフォルトの名無しさん2007/03/03(土) 02:57:20
ところでこれWikiの完璧なソースはどこにあんの?
0871デフォルトの名無しさん2007/03/03(土) 09:58:10
本の丸写しだけは勘弁してほしい
0872デフォルトの名無しさん2007/03/03(土) 12:54:39
そんなアホなことはしない
0873デフォルトの名無しさん2007/03/03(土) 16:31:01
日本語よりサンプルコードの方が学習しやすい、って人もいるけど、
Haskellでそれができるとしたら「型」の概念に対して
相当鋭敏な感覚を持ってないとむつかしいような気がする。

javascriptとかだったらなんとなく見よう見まねで動きそうな気もするが。
0874デフォルトの名無しさん2007/03/04(日) 00:46:42
モナド変換子おもすれー

import Prelude hiding(either)
import Control.Monad.List
both, either :: a -> a -> ListT [] a
both a b = return a `mplus` return b
either a b = lift [a,b]
main = do
  -- Both Bill and Mary loves either Martha or John.
  print $ runListT $ do
    lover <- both "Bill" "Mary"
    lovee <- either "Martha" "John"
    return $ lover ++ " loves " ++ lovee

  -- Either Martha or John is loved by both Bill and Mary.
  print $ runListT $ do
    lovee <- either "Martha" "John"
    lover <- both "Bill" "Mary"
    return $ lover ++ " loves " ++ lovee

結論: 自然言語にも副作用があるというのにHaskellときたら(略
0875デフォルトの名無しさん2007/03/04(日) 14:31:37
> both, either :: a -> a -> ListT [] a

こんな書き方できるの初めて知った
0876デフォルトの名無しさん2007/03/06(火) 23:57:05
関数言語むつかしいよ
こういうプログラムをつくってみようと思い立ってもまったく書けない
あれ?文法どうだったっけ?みたいな
0877デフォルトの名無しさん2007/03/07(水) 00:13:36
>>876
手続き型言語で培った慣れが役に立ちにくいというだけであって、
学習の難しさはさほど変わらないんじゃなかろうか。
初めてプログラミングを習った人は大抵、
「思い立っても全く書けない」状態を経験するだろう。
0878デフォルトの名無しさん2007/03/07(水) 10:43:06
Haskellに限ればリスト覚えたら大体何とかなる希ガス
0879デフォルトの名無しさん2007/03/07(水) 20:46:20
そんなおれになんか課題だしてくれないか
ふつうのHaskellプログラミングでMAP関数のとこまでは読んだ
08808392007/03/07(水) 21:28:52
lispちょっと勉強してきました
cのプリプロセッサを強引に前処理としてかませば
lispのマクロと同じことができるかも
0881デフォルトの名無しさん2007/03/07(水) 21:36:55
どういう勉強をどれくらいしたのかは知らないけど、lispのマクロについてもっと勉強した方がいいよ。
0882デフォルトの名無しさん2007/03/07(水) 21:37:05
>>879
テキストファイルの各行を30文字に切り詰めるプログラム。
0883デフォルトの名無しさん2007/03/07(水) 21:39:07
>>880
Cプリプロセッサは実質的にチューリング完全だから能力は十分だけど、
Haskellの方がメタなことをするのに適していないような気がする。
例えば、局所的に型を宣言することができないとか。
0884デフォルトの名無しさん2007/03/07(水) 22:49:05
880じゃないけど
>Cプリプロセッサは実質的にチューリング完全だから能力は十分
これってホント?ループがかけないような
0885デフォルトの名無しさん2007/03/07(水) 22:49:53
局所的に型を宣言?ってどゆこと?
0886デフォルトの名無しさん2007/03/07(水) 22:50:39
自己includeでループはできそう。
0887デフォルトの名無しさん2007/03/07(水) 23:20:39
なるほど、define,ifdefとか組み合わせたらいけそうだな、納得
0888デフォルトの名無しさん2007/03/07(水) 23:46:56
881です。CPPがチューリング完全だとは知らなかった。その点は謝りたいと思います。


ところで、どうもまだ混乱しているんですが、自己includeのループをどう止
めたものかがわりません。 ifdef とかで何とかなるもんなの? define の再
定義では上手く行かないと思うんだけど。

たとえば階乗を計算するコードって、どんな概形になりますか?
# スレ違いすぎ?
0889デフォルトの名無しさん2007/03/07(水) 23:48:14
BOOST_PP
でループはできる
08908392007/03/07(水) 23:55:48
>>881
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
まだレベル1から2ぐらいです

これ以上勉強したらhaskellには戻ってこないと思う
0891デフォルトの名無しさん2007/03/08(木) 00:11:56
>>888
適当だけどこんなん用意して
#include<boost/preprocessor/slot/slot.hpp>
#ifdef N
    #define BOOST_PP_VALUE N
    #include BOOST_PP_ASSIGN_SLOT(1)
    #define BOOST_PP_VALUE 1
    #include BOOST_PP_ASSIGN_SLOT(2)
    #undef N
#endif
#if BOOST_PP_SLOT(1) == 0
    #define X BOOST_PP_SLOT(2)
#else
    #define BOOST_PP_VALUE BOOST_PP_SLOT(2)*BOOST_PP_SLOT(1)
    #include BOOST_PP_ASSIGN_SLOT(2)
    #define BOOST_PP_VALUE BOOST_PP_SLOT(1)-1
    #include BOOST_PP_ASSIGN_SLOT(1)
    #include __FILE__
#endif
こんな風に呼び出す。
#define N 6
#include "fact.c"
main(){
    printf("%d\n",X);
}
あとはC++関係のスレで
0892デフォルトの名無しさん2007/03/08(木) 00:42:45
>>888
俺が念頭に置いてたのはこんな感じ。
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp

>>885
let data Foo = ... in ...
のように式の中で即席の型を作れると、C++のテンプレートの
真似ができるかと思ったが、良く考えるとそうでもなかったかも。
0893879じゃない2007/03/08(木) 01:49:32
>>882 できました!
でも、IOモナドはいまいちピンと来てないです。
あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)

import System.IO
import System.Environment
main = do args <- getArgs
      hFile <- openFile (head args) ReadMode
      content <- hGetContents hFile
      putStr $ unlines $ map (take 30) $ lines content


最後の行を
      mapM (putStrLn . (take 30)) $ lines content
にしてもいけました。

ツッコミお願いします
0894デフォルトの名無しさん2007/03/08(木) 02:03:52
>>893
お疲れさん。
>あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)
hGetContentsは全部メモリに読んでる訳じゃなく、入力は遅延する。
これはこれで気持ち悪い(副作用と紙一重)けど、便利なことは間違いない。
0895デフォルトの名無しさん2007/03/08(木) 02:18:49
単に読み込み専用で開けて読み込むだけならreadFileで良いと思う。

import System
main=getArgs>>=readFile.head>>=mapM_ putStrLn.take 30.lines
08968932007/03/08(木) 02:25:45
>>894
ありがとうございます!
Stringの値が必要になったら全読みされちゃわないんですか?
Stringのケツが必要になるまでは遅延される?

>>895
1行キタ─(゚∀゚)─!!!! まさに関数型!!!
関数合成ってそう使うんですね。初めてしっくり来ました。
08978932007/03/08(木) 02:55:18
おっとトラップ?
main=getArgs>>=readFile.head>>=(\c->mapM_ (putStrLn.take 30)$lines c)
にしないと、>>882の動きになりませんでした。
このラムダは消せないのでしょうか…?
0898デフォルトの名無しさん2007/03/08(木) 05:30:36
自分なら
main = getArgs>>=readFile.head>>=putStrLn.unlines.map (take 30).lines
とやる。
0899デフォルトの名無しさん2007/03/08(木) 06:30:58
>>897
main = getArgs >>= readFile . head >>= mapM_ (putStrLn . take 30) . lines

ちょっと分かりづらいか・・・。
0900デフォルトの名無しさん2007/03/08(木) 09:28:14
#includeで実現できるのはスタックにすぎない
よって実現できるのはプッシュダウンオートマトンであってTuring機械ではない
(外部スクリプトで複数回CPPをかけていいんならTuring完全になる)

ただしC++ templeteを使っていいならTuring完全になる
09018392007/03/08(木) 09:37:55
lispと比べたhaskellのメリットは

http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3A%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3&l=en
>なので、C並に速いLispコードは見た目も安全性もC並になる、というのが私 (Shiro) の経験です。

haskellの場合はC並にごちゃごちゃしなくてもC並の速度が実現できるということなのでしょうか?
0902デフォルトの名無しさん2007/03/08(木) 09:56:04
言語同士にはそんな単純に言い切れるほどはっきりとした差がつくもんじゃないよ
おもちゃベンチマークでもなければね

どうして安易な1フレーズの結論に飛びつきたがるのかなぁ
0903デフォルトの名無しさん2007/03/08(木) 10:22:58
>891
Boost だけど template を使ってるわけじゃないんだね。
漠然と、シンボルを結合したりしているのかな、とは思っていたが、うまい方法が思いつかなかったよ。ありがとう。
0904デフォルトの名無しさん2007/03/08(木) 10:38:50
>>900
>>892のリンク先のコード(β簡約器)はincludeを使っていない。
見れば分かるけど、λ式を最大nステップ簡約するマクロはO(log n)個のdefineで書ける。
だから「実質的に」チューリング完全、と書いた。

http://pc11.2ch.net/test/read.cgi/tech/1068359871/
完全にすれ違いなのでレスがあればこっちによろしく。(適当なスレが見付からなかったので)
0905デフォルトの名無しさん2007/03/08(木) 10:55:04
Boost PPの話はここに詳しい人がいると思います

Boostを語れゴラァ part3
http://pc11.2ch.net/test/read.cgi/tech/1158991211/
0906デフォルトの名無しさん2007/03/08(木) 12:15:39
>>899
最後は、mapM_の部分適用…と思って、小一時間悩みました。
最後は、(mapM_ (putStrLn . take 30)) . lines と評価されるんですね。

結合順位重要。関数適用最強…と。 _〆(。。)
0907デフォルトの名無しさん2007/03/08(木) 16:12:46
GHC使いなら -ddump-parsed をつけてコンパイルしてみるのも手かと。
0908デフォルトの名無しさん2007/03/08(木) 23:48:49
ちょっとやってみたけど


まぁまぁ面白いな
0909デフォルトの名無しさん2007/03/09(金) 03:49:25
>>907
知らなかった…。初心者にはあり難い。
0910デフォルトの名無しさん2007/03/09(金) 12:39:44
main = readLn >>= print . (1+)
を -ddump-parsed つけてコンパイルしてみたら(GHC6.6)

==================== Parser ====================
main = (readLn >>= print) . ((1 +))

って表示されたんだが、このパースは間違ってる。
実際、これをコンパイルすると型のミスマッチのエラーが起きるし。

本来は
main = readLn >>= (print . (1 +))
とパースされるわけで、実際処理系自体はそのようにパースしてるはず。
0911デフォルトの名無しさん2007/03/09(金) 13:05:50
結合の弱い順に演算子を使った
main = a >> b || c && d == e : f + g * h ^ i . j
に対しては
main = ((((((((a >> b) || c) && d) == e) : f) + g) * h) ^ i) . j
となった。どうも、演算子の結合強度を全く考慮していないらしい。
といっても、演算子の結合強度はパースしてみないと分からないので仕方ない。
0912デフォルトの名無しさん2007/03/09(金) 13:11:30
代わりに-ddump-rnを使えば良さそう。
09139072007/03/09(金) 17:16:48
>>912
あー、ほんとだ。こっちの方が正しいね。サンクス。
0914デフォルトの名無しさん2007/03/11(日) 12:39:27
main = writeFile "a.txt" "こんにちは"

GHC 6.6 Windows環境で上記ソースをUTF-8にして実行してみたんですが、
出力ファイル(a.txt)の中身が「S?kao」となってしまいます。
日本語を正しく出力するにはどうすればいいんでしょう?
0915デフォルトの名無しさん2007/03/11(日) 12:42:46
>>914
変換が要る。
>>402-414あたり参照。
0916デフォルトの名無しさん2007/03/11(日) 13:11:16
毛唐に任せてたら対応がいつになるか分かったもんじゃないぜ。
だれか直してパッチ送りつけろ。
0917デフォルトの名無しさん2007/03/11(日) 14:21:50
http://hackage.haskell.org/trac/summer-of-code/ticket/1113
これに応募するとか。
09189142007/03/11(日) 15:47:50
>>915
どもです。IOの標準ライブラリがUTF-8対応されたわけじゃないのですね。

日本語がどうしても必要な時はWinHugs使ってみます。
こちらはこちらでアンインストールできないバグがありますが・・・。
0919デフォルトの名無しさん2007/03/12(月) 00:09:24
これってWindowsAPIとか呼べますか?
0920デフォルトの名無しさん2007/03/12(月) 00:18:43
これってどれよ
0921デフォルトの名無しさん2007/03/12(月) 00:52:28
これっちゃこれよ
0922デフォルトの名無しさん2007/03/12(月) 01:27:08
importsのしたにSystem.WIn32.*ってあるな。
でもリファレンスには載ってない。System.Posix.*は載ってるのに。
0923デフォルトの名無しさん2007/03/12(月) 02:44:10
>>917
それは違うんじゃないか?
> * String/ByteString/UTF8String/UTF16String as filename
まあファイル名にも使えて然るべきだけど。
0924デフォルトの名無しさん2007/03/13(火) 16:39:59
>>923
コード変換が実装されない一番の原因は、今のGHCのIOライブラリが拡張しにくい
構造になっていることだから、それをまずなんとかするのが先決だ。
で、なんとかしようというのが>>917の提案だろう。
枠組さえできれば、コード変換を実装する事自体は難しくない。
0925デフォルトの名無しさん2007/03/13(火) 23:15:59

おまえらWindowsでHaskellしてんの?
Linuxの場合、Fedoraはいろいろ対応してるぽいが、
Debian系のUbuntuは使用不可能?
0926デフォルトの名無しさん2007/03/14(水) 02:00:13
>>924
いつのまにか書き換えられてるな。
・Various encodings (UTF8,UTF16...) for text files
もリンク先に増えてる。うしゃ。

しかし、
class Stringable a where
 length :: a -> Int
 concat :: [a] -> a
 ....

instance Stringable String
instance Stringable ByteString
instance Stringable UTF8String
instance Stringable UTF16String

なの?個々の文字はどうするんだ?
Charに32ビット使ってるのにUnicode(UCS4)のコードポイントそのまま使うんじゃないの?
つうか、リストじゃないの?そんなのありえるの?
0927デフォルトの名無しさん2007/03/14(水) 15:05:25
>>926
>個々の文字はどうするんだ?
http://darcs.haskell.org/SoC/fps-soc/Data/Stringable.hs
には、
class Stringable a where
  ...
  head :: a -> Char
  tail :: a -> a
  ...
というメソッドがある。

>Charに32ビット使ってるのにUnicode(UCS4)のコードポイントそのまま使うんじゃないの?
>つうか、リストじゃないの?そんなのありえるの?
何が言いたいか全然分からんw
もうちょっと詳しく。
0928デフォルトの名無しさん2007/03/14(水) 15:50:23
>>925
自分でコンパイルするとか
0929デフォルトの名無しさん2007/03/14(水) 19:59:59

Haskellの型推論って中の人どんなふうに動いてんの?

Javaにはそんな機能ないけど、
例えばプリミティブ型もIntegerとかにして、
ぜんぶをObject型で扱えば、なんでも突っ込めるようになるはずだけど、
それとはまったく違う?


レス数が900を超えています。1000を超えると表示できなくなるよ。