トップページtech
174コメント70KB

-generic- 総称的プログラミング -programming-

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
erasureなんてうんこ、とか。
0002デフォルトの名無しさんNGNG
ひとりでできるもん!
0003デフォルトの名無しさんNGNG
ジェネティック・プログラミングぅ〜?
遺伝アルゴリズムか。北野武ウザすぎ
0004デフォルトの名無しさんNGNG
>3 まずはアルファベットを読めるようになろう
0005デフォルトの名無しさんNGNG
>3 漢字もな
0006デフォルトの名無しさんNGNG
template
0007デフォルトの名無しさんNGNG
>>3
なぜにビート。宏明だろ。
0008デフォルトの名無しさんNGNG
>>3 はかなりのアホだな。
0009デフォルトの名無しさんNGNG
このスレタイのセンスのなさ
0010デフォルトの名無しさんNGNG
>>3 << >>3
001110NGNG
間違った
0012デフォルトの名無しさんNGNG
>>1 ネタ振りすらろくにできねぇ癖に、スレ立てすんなよ

■■■■■終了■■■■■
0013デフォルトの名無しさんNGNG
勿体ないから関数型系の言語のGenericFunctionの実装についてうだうだ騙ってみるスレにしちゃうとか?(w
0014デフォルトの名無しさんNGNG
では、まず >>13 さん、どうぞ。
0015デフォルトの名無しさんNGNG
C++の独壇場?
0016デフォルトの名無しさんNGNG
関数型系の言語のGenericFunctionって、CLOSの総称関数とはどういう関係?
CLOSの総称関数とOOのgenericsって、どういう関係?
0017デフォルトの名無しさんNGNG
同じことじゃないの?
CLOSの総称関数って英語では generic function だよね。

ここでいう generics って、どっちかというと ML の parametric polymorphism に
近いんじゃないの? で、MLを使っている側からいうと何が新しいんだかよくわからな
いのだが。
0018デフォルトの名無しさんNGNG
Java Genericsはいい感じだね
0019デフォルトの名無しさんNGNG
さて、俺も総称するかな。
0020デフォルトの名無しさんNGNG
> で、MLを使っている側からいうと何が新しいんだかよくわからないのだが。

ようやく世の中が追いついてきたということ。
次は型推論だ!

0021デフォルトの名無しさんNGNG
MLとHaskellはどっちが強いのか教えてください
0022デフォルトの名無しさんNGNG
>>17
そうなん?
関数型言語はよく知らないけど、Genericsっていうと、
ひとつの処理実装で、型を (゚ε゚)キニシナイ!!っていう感じだけど、
CLOSの総称関数は、引数型組み合わせごとに処理実装をシコシコ用意してやる、
って感じで、全然方向が逆のようなイメージだけど。
0023デフォルトの名無しさんNGNG
片推論ってCでもやってるじゃん。
0024デフォルトの名無しさんNGNG
>>17
最近のトピックとしてJavaに導入というだけで、
Generics自体が別に新しいとは誰も思ってないでしょ。
それよか、大先輩(なのか知らんけど)のMLだとGenericsはどんな感じなの?
ついでに関数型言語の勝たす異論てどのぐらいすごいの?
0025デフォルトの名無しさんNGNG
>>24
> ついでに関数型言語の勝たす異論てどのぐらいすごいの?

関数を定義する時に型を宣言しなくてよく、自動的に、
そのように定義できる(最も一般的な)型が与えられる。
もちろん矛盾が存在すれば検出される。
0026デフォルトの名無しさんNGNG
>>25
それってそんなにうれしいの?
それに、意図してた型と他の型になっちゃうかもしれんじゃん。
しかし、勝手に一般的な型が与えられるってのは、Genericsっぽいな。
0027デフォルトの名無しさんNGNG
型パラメータほしいっす。

例えば、比較関数で  public abstract int compare(<typeA> x, <typeA> y) ;
例えば、加算関数で public abstract <typeα> plus(<typeα> x, <typeα> y);

みたいな感じで、引数x と 引数y と、あと戻り値が、同じ型である事を宣言できれば。。。
何でもObjectで宣言して実装でキャスト、みたいなコテコテのコードを、
自然な感じのPolyMorphismとして扱えるやん。。。

で、Java Genericの機能はどのヘンまで北の?
JSRで議論が始まった頃は注目してたけど、
最近はJSRやJDK1.5仕様書、どころか厨房雑誌(JavaWorld)すら隅々まで読む暇もなくて、
よくわかんない。
0028デフォルトの名無しさんNGNG
> 例えば、比較関数で  public abstract int compare(<typeA> x, <typeA> y) ;
> 例えば、加算関数で public abstract <typeα> plus(<typeα> x, <typeα> y);
なぜそれが出来ないと?
つうか、型パラメータって意味間違ってね?
002925NGNG
>>26
> それってそんなにうれしいの?
とてもうれしい。型宣言がいらないからね。
細かい関数を(関数の中でも)沢山つくる関数型言語では、
いちいち型宣言するのは面倒すぎる。

> それに、意図してた型と他の型になっちゃうかもしれんじゃん。
自分で明示的に宣言すればいい。

> しかし、勝手に一般的な型が与えられるってのは、Genericsっぽいな。

# Haskell で、add x y = x + y
# と定義すると、 add :: Num a => a -> a -> a という型があたえられる。
# "Num a => "というのは、+オペレータを持つtype class Num に 型aが
# 属している、という意味。type classはMLにはない。
# add :: Int -> Int -> Int などとつけくわえれば適用される型を制限できる。
0030デフォルトの名無しさんNGNG
>>27-28
それは型パラメータじゃなくて、type classではないかと。

型パラメータというのは、
data List a = Cons a (List a) | Empty
というときのaのこと。
Cons True (Cons False Empty) :: List Bool
Cons 1 (Cons 2 Empty) :: List Int
などのように任意の型毎のリストがつくれるようになる。

head (Cons a _) = a
と定義すれば、これは型推論により、List a -> a という型が与えられ、
 List Bool にも List Int にも作用できるものになる。
0031NGNG
それはHaskellでの「型パラメータ」なのでは?
Genericsでの「型パラメータ」は、hoge<T>の<T>とか自体では?
。。。あ、同じか?
なるほど、これが関数型でのGenericsか?(ホントか?)
あ、いや、これはただのhoge<T>ではなくhoge<T extends U>が相当するのではないか?
だって、MLにはないんだよね?
0032NGNG
あ、いや継承関係なんてないからhoge<T>でいいのか。失礼。
しかし、MLにないっちゅうのはどういう事よ?
0033デフォルトの名無しさんNGNG
>>31
>>17  
> ここでいう generics って、どっちかというと ML の parametric polymorphism に
の続きかと思っていた。

C++のテンプレートはadhoc overloadingがあるから、
テンプレートになるべき型を推論することはできないね。
パラメータとしての型が指定されてから、コンパイルできたりできなかったり
する。duck typingになってるってことなのかな。
0034NGNG
ああ、>>27でみんな同じ型ってところに着目したのね。
たぶん彼はそういう意図はないと思う。

というかそろそろ厨には訳若めでふ。この辺から勉強してきまふ。
http://www.tabee.com/private/lab/types/type22/node5.html
http://216.239.57.104/search?q=cache:E7Y5J8QeIAQJ:web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/+parametric+polymorphism%E3%80%80ad+hoc&hl=ja&lr=lang_ja&ie=UTF-8
0035デフォルトの名無しさんNGNG
つうか、Genericsってなんのメリットがあんの?
コンテナで中身の型が保証できるだけじゃねぇの?ショボ!
0036デフォルトの名無しさんNGNG
>>32
int hoge<T>(T)の定義で例えばf, g, ..という関数を利用するとして、
そのf,g ..がいくつかの特定の型にしか適用できないものであることがあるよね。
Listのheadは本当にgenericでどんなaに対するList aにでも適用できたけれど。

その場合、hogeの型は、あえていえば、
「なんだかわからないがfという名前の、これこれという
型の整合性を満たす、関数が適用でき、さらにgという...な型(T)をとって、
intを返す関数」になる。

それはそれで便利なんだけど、
これではあらかじめhogeをコンパイルしておくことが難しいし、
型推論したら
hoge :: T -> int, where T can be argument of functions f, g, ..
    f has type T -> double, g has ...
というえらいことになってしまう:-)
0037デフォルトの名無しさんNGNG
そこでHaskellでは
そのfやgが属するべきtype classをあらかじめ指定しておいて、
そのtype classに属する型であることを推論できるようにしてある。

例えば
class FG a where
    f :: a -> Double
    g :: a -> Int
とあると、
hoge x = floor (f x) + g x 
の型は、hoge :: FG a => a -> Int と推論される。
0038デフォルトの名無しさんNGNG
> そのf,g ..がいくつかの特定の型にしか適用できないものであることがあるよね。
> Listのheadは本当にgenericでどんなaに対するList aにでも適用できたけれど。
そういう型を特定する目的がある場合は、 <T extends U> でつね。(ホントか?)

型推論であれば、f,gからTとして取り得る型が決まりそうだけど。
0039デフォルトの名無しさんNGNG
なるほど、FGがUですな。
継承(subtyping)と任意にtype classを使えるところが違いか?
ん?おなじ?
0040デフォルトの名無しさんNGNG
>>39
> 継承(subtyping)と任意にtype classを使えるところが違いか?
そうだね。
継承関係に無い無関係な(定義済でもOK)型を自由にいつでも
そのtype classに追加することができる。

> 型推論であれば、f,gからTとして取り得る型が決まりそうだけど。
# ちょっと意味がわからないけれど、こういうことだろうか。
プログラムが単一のもので、他から利用されること無く、
全部書き上がっている場合は、全ての型とf, gをチェックすれば、
取りうる型の集合かを知ることができる。
でもそのプログラムにデータ構造や関数をつけくわえてしまえば
その集合は変わってしまい得る。
したがってバイナリのライブラリにはできないし、どこか変更がある度に
コンパイラはソース全体を読んでhogeを使用している部分を
再コンパイルする必要がでてくる。
エラーメッセージもわけ分からなくなるし。
0041デフォルトの名無しさんNGNG
ああ、f,gの型は確定可能という前提ですた。そんな前提なら元々型推論自体いらん罠。鬱氏。

ただ、
> そのf,g ..がいくつかの特定の型にしか適用できないものであることがあるよね。
を束ねる型って、実際、継承親しかないんじゃないのかな。
0042デフォルトの名無しさんNGNG
> 継承親しかないんじゃ
継承親と同じ意味になるって意味でつ。
type classと継承は、実用上同じ意味かなと。後から定義できるかどうかを除けば。
004326NGNG
>>30,>>37
結局、
「型パラメータ」という用語は、Haskelでは構成型の型推論等で使う用語で、
 >>26の例は 関数の型的制約だから、type class と呼ぶべきだ、
という事なのでしょうか?

関数型言語スレッドにありがちな事ですが、議論が微妙すぎて、
単に教科書のおさらいをしてるだけなのか、
(Genericや型推論という)テーマを新たに定義しなおそうとしているのか、
よくわかんないっす
0044デフォルトの名無しさんNGNG
>>34
最初の方のリンク、米澤県の輪講っすか?
「Type Systems and Programming Languages」ってどの本だろう?
日本のアマゾンで探しても、みつかんねぇや。これかな?
  http://www.amazon.co.jp/exec/obidos/ASIN/047194128X/
004544NGNG
>>34の輪講本の件、
本家 amazon.com でも探してみたけど、そゆータイトルの本見つかんないっす。
・"Object-Oriented Type Systems" by by Jens Palsberg, Michael I. Schwartzbach (Contributor) $65.95
これかな。

いずれにせよ、さすが米澤県っすね。マニア心をくすぐる渋い輪講テーマだ(w
今度、その本注文しよっと
0046デフォルトの名無しさんNGNG
>>34の最初の方のリンク ("Type Systems and Programming Languages" 輪講)
 23.2 Varieties of Polymorphism
  Parametric Polymorphism: 前節と本節のメイン。
    型チェックではとりあえず「generic な」型を当てておいて、必要に応じて具体的な型で考えるタイプ。
    Polymorphic なコードはプログラムテキスト上は同じ見かけになる。

    最も強力なのは本節の impredicative (or first-class) polymorphism だが、
    実用上広く使われるのは let-polymorphism である。

  Ad-hoc Polymorphism: 型ごとに違ったコードを書くタイプ。
    最も広く使われているものに overloading、それを一般化した multi-method dispatch 等がある。
    intensional polymorphis や typecase のように、実行時に型情報を利用できる強力な機構もある。
    OOP 界で polymorphism というときには ad-hoc polymorphism の一種である
    subtype polymorphism を指すことが多い。

>>38-42
簡単に言うと、「Genericで型推論!」つう事は、
・OOで subtype polymorphismは普及したから、次は
・Genericで Parametric Polymorphismしようよ、
って話でOK?

(10年前からそりゃわかってるさ、わかってるけどOO屋が頭固いから・・・)
0047デフォルトの名無しさんNGNG
>>44-45
http://www.amazon.com/exec/obidos/tg/detail/-/0262162091/102-2455043-2214555?vi=glance
これでしょ?
ソース:http://web.yl.is.s.u-tokyo.ac.jp/~kohei/rinkou/types/
(ってまあ、厨の漏れにはさっぱりちんぷんかんぷんな訳だが)

0048デフォルトの名無しさんNGNG
Generic Program'mistの漏れは、
モニータスピカーも、フィンランドのGenelecにしますたが、何か?
0049デフォルトの名無しさんNGNG
generic programming がなんなのか未だによく分からないんだけど、
Ruby の module みたいなのは generic programming って言うの?
0050デフォルトの名無しさんNGNG
>>46
関数型言語の方でもGeneric Programmingは最新のテーマだよ…。
Parametric Polymorphismなんつー30年前のネタとは違う。
G'Caml とか Generic Haskell とか調べてみれ。
0051デフォルトの名無しさんNGNG
ケンブリッジの人たちが、MSRケンブリッジに大量に。
http://research.microsoft.com/projects/clrgen/
0052デフォルトの名無しさんNGNG
>>50
ふ〜ん、そうなんだぁ〜。
CommonLispコンパイラーやC++ STL近辺で
Parametric Polymorphismと関連して
総称型とかGenericとか普通に言ってたから、
両者の境界が見えなかったあるよ〜。

で。Parametric PolymorphismとGeneric Programmingの境界はナニですか?
あと、Genericのびぶりおぐらふぃぃキボンヌ
0053デフォルトの名無しさんNGNG
PolymorphismとGenericsは、深い関係がある気がするけど、
どういう関係なんでしょうか。
0054デフォルトの名無しさんNGNG
つ〜か。
関数や変数の型付けが弱いLispでは、consセル以外の型なんて外付けだから、昔からGenericだけど、
型をきちんと扱う関数型言語では、型付けと総称型って、ムチとアメみたいな関係があって、
ムチの有効性を維持しながら如何にアメを提供するか、つう議論の決着がなかなかつかないのかな。

そ〜ゆ〜話題は、なんかSMの女王様向けの話題っすね。
漏れは、ムチよりもムチムチが好みだ・・・。
0055デフォルトの名無しさんNGNG
と、無恥な男がなんか世迷い言を申しておりますが。
>>52-53ってどうなんでしょうね?
0056デフォルトの名無しさんNGNG
>>52
Parametric Polymorphismを使えば、「list of intの全要素に関数を
適用する関数」も「list of stringの全要素に関数を適用する関数」
も「list of hogehogeの全要素に関数を適用する関数」も一個の定義で
書けた。OK。万歳だ。(MLとかHaskellのmap関数)

Generic Programmingなら、「list of hogehogeの全要素に関数を
適用する関数」も「tree of fugafugaの全要素に関数を適用する
関数」も「array of piyopiyoの全要素に関数を適用する関数」も
一個の定義で書ける。いえーい。(GenericHaskellのpmap、C++のfor_each…)

とか、あくまで一例だけどな。
http://web.comlab.ox.ac.uk/oucl/research/areas/ap/topics.html#GP

C++ STLやJavaはオブジェクト指向とかカプセル化を前提にしたGenericsなんで
実体は要するにParametricPolyとAdhocPolyを巧妙に混ぜて使ってる
だけにならざるを得ないんだけど、概念としては、そーゆーこと。
0057デフォルトの名無しさんNGNG
Parametric Polymorphismと、Generic Programmingの違いぃー?
場の量子論をメズスコピックと言い直し、最近はナノテクノロジーと呼ぶのと一緒じゃないのかな?
研究の焦点や目的は、微妙に変化してるけど、扱ってる対象はおんなじ、みたいなw
0058デフォルトの名無しさんNGNG
>>56
Javaだと、Iterator interfaceっす
0059デフォルトの名無しさんNGNG
リストなんかのparametric polymorphismでgenericだというのはトリビアルなわけで、
どれだけのことをGenericにできるかというのが課題なのだと思う。

Generic tree traversal についての最近のpaper(Haskell).
Scrap Your Bilerplate: 
A Practical Design Pattern for Generic Programming
http://www.cs.vu.nl/boilerplate/
Visitor patternとの比較なんかもしてるしreferenceをたどるのも面白いかも。

個人的には"Derivable type classes (2000)"での、
「全ては式である」(by mathematica)的な(data typeの構造について帰納法)
方法に期待していたけれど開発中止っぽい:-(
0060デフォルトの名無しさんNGNG
JavaのIteratorだと、回すことは出来ても、肝心の関数適用が。。。
で、型に関係なく適用できる関数ってなにができるの?
それとも、回すこと自体がGenerics?
0061デフォルトの名無しさんNGNG
>>59
お、ようやくコアな話題、かな。

OOとかデザパタっつうのも、形を変えた(一般向けの)型システムに関する議論なわけで、
漏れはOO専門家ぁ?みたいなのに身をやつして、そのあたりを(暇な時に)追っかけてますがw
 (構成型の要素の型をパラメータとした)実装継承=パラメトリック多態性
 (Javaインターフェースの実装のような)型継承 =総称多態性
ってなマッピングするだけだけどw

最近はOOがほぼ定着し(OOPが定着しただけだという話もちらほら)、
かつては関数型言語の話題だった総称型を扱う型システムも、OOのボキャブラリで語れるようになって、
なかなか便利な状況になって参りますたね。

最後の行、「全ては式である」つうのは、何の話でしょうか?
全てのオブジェクトは、関数型言語の部分計算キャッシュに過ぎないIという信念を持って
OOしてる漏れには、なんか気になるフレーズですた。
0062デフォルトの名無しさんNGNG
>>60
> JavaのIteratorだと、回すことは出来ても、肝心の関数適用が。。。
が、なんなの?関数適用の構文が変わるとは思えないんだが。

> で、型に関係なく適用できる関数ってなにができるの?
特定の型にだけなんらかの操作をするとかね。
>>59のペーパーでは複数のデータ型からなるTreeをトラバースして
特定の型に対してのみ変更を加えるといった問題を考えている。

> それとも、回すこと自体がGenerics?
それもGenerics。
0063デフォルトの名無しさんNGNG
>>62
 >>60の方向を追求すると、
  eval機構とか、高階関数とか、リフレクション、てな方向に逝って議論が発散するヨーカン。
 その話題は、一番最初に決めちまうと身動きが取れなくなる、
 一番最後に決まれば良いんだよ、といってみるテスト
0064デフォルトの名無しさんNGNG
>>61
> 最後の行、「全ては式である」つうのは、何の話でしょうか?

Mathematicaでは、全てのもの(関数、データ型等)が
"Head[a, b, c, ...]"という、リストにタグがついたような形をしていて、
それは「式」といわれる。そして、Map, Apply, First, Rest, .. といったような
いわゆるリスト操作的な関数が全ての「式」に適用できる。
構造を操作する関数が完全にGenericになっている。
Mathematicaはdynamic typingだけどね。

Derivable Type Classes というのは、data typeを
どれも同じタグ(コンストラクタ)+引数みたいな形であつかえるようにする話。

> 全てのオブジェクトは、関数型言語の部分計算キャッシュに過ぎないIという信念を持って
> OOしてる漏れには、なんか気になるフレーズですた。

…わからないです。
0065デフォルトの名無しさんNGNG
>>62>>63
なるほど。Thx。
関数適用についてはGenericsではペーパーの議論レベルって事ね。
OOでは、Genericよりも手堅くSubTypingでGoと。
そうかんがえると、Iteratorもコンテナの枠組みだし、
>>35はあながち間違いじゃないということ?
0066デフォルトの名無しさんNGNG
>>64
さんくす。

こっちの信念の話は、ややこしいから横置いとくとしてぇ〜(苦笑

あ、やっぱWolframたんの数式処理システムのお話っすか。(数学者が何か言ったんだと思ったw
う〜ん、そーゆー考え方、漏れにとってもある種原点の体験っす。
できれば、やさぁ〜しく教えて下さると助かりまっす。
#2chだと、シム板のMAXIMAスレが多少関係あるのかなぁ。。。
0067デフォルトの名無しさんNGNG
>>65
> 関数適用についてはGenericsではペーパーの議論レベルって事ね。
GHCに実装されてるよ。

>>66
Mathematicaはこれとか
http://documents.wolfram.com/v5/TheMathematicaBook/PrinciplesOfMathematica/Expressions/2.1.1.html

>>64では"Head[a, b, c, ...]"でなく"Tag[a, b, c, ...]"
と書くべきだったな。

Derivable Type Classは、例えばこういうリストを
> data Data a = A a (AA a) (AAA a) | B a | C | D
((a * ((AA a) * (AAA a))) + (a + (1 + 1)))
のような直積と直和と考えて帰納的に操作するって感じ。
ペーパーは
http://research.microsoft.com/~simonpj/Papers/derive.htm
0068デフォルトの名無しさんNGNG
GHCに実装されてるってのは、
>特定の型にだけなんらかの操作をするとかね。
でしょうか。
Genericsの関数適用ってのは、出来る奴にだけする?
それって訳解るんでしょうかね。人間がコーディングするという前提で。
OOのSubTyping+AdHocならすっきりですが。
0069デフォルトの名無しさんNGNG
>>68
私はGHCの例を出された方とは違うのですが、
正直>>68さんのおっしゃっておられる事は、
Genericとは違う範疇の問題だと感じられます。

全ての型に対するGenericな操作、などというものは、
Lispのevalとか、OOのObjectクラスにしか通用しない話であり、
今更議論しても得る所は少ないのではないでしょうか?
0070デフォルトの名無しさんNGNG
むしろ、>>68は C++のTemplate以上の物は理解できないので要りません、
と言っているだけのような気がするテスト。
0071デフォルトの名無しさんNGNG
いや、むしろ>>68さんは、C++のTemplate以上の物は触ったことがないので、想像もできません、
と白旗あげてるだけのような気がするデバッグ。
0072デフォルトの名無しさんNGNG
>>67
どもども、これから、読ませて頂きます。
即レスは、、、ちょいとムズイっぽいです。

あと、オブジェクト指向言語の上で、数式と型のお話を実装しようとした試み(symbolicC++)の本が、
自宅のコンソール下に放置しっぱなしで、こっちも数年振りに目を通しとこうかなw
0073白旗NGNG
全ての型じゃないGenericsの操作は、OOのSubTyping+AdHocじゃなくても、
訳解るやり方なの?厨なので想像つかないや、ってレスです。
>>69トン楠です。
0074NGNG
こんばんわ、ボンベルタ橘です。

◆新着情報◆. ★2004年4月8日★ UV対策をアップいたしました。
★2004年4月5日★ ジーンズニュースをアップいたしました。 ★2004
年3月30日★ リップリップのオススメをアップいたしました
0075デフォルトの名無しさんNGNG
JavaのInterfaceは、subtypingとは違う、と言ってみる結合テスト。
0076デフォルトの名無しさんNGNG
>>75
そうは言っても、Javaのinterfaceは、ad-hockそのものだろ、と言ってみる手戻り発生。
0077デフォルトの名無しさんNGNG
そしたらJavaのgenericは、実装コードを持つinterfaceとか、多重継承可能な抽象クラス、みたいなもんだろうか?
というQA票を発送するテスト。
0078デフォルトの名無しさんNGNG
関係ないが最近CMでジェネリック医薬品って言葉をよく聞くようになったな。
なんにでも聞く薬かと思ってしまう(笑)
0079デフォルトの名無しさんNGNG
JavaのTigerのGenericsは、erasure方式でコンパイラが
型パラメタのキャストをいれるもの、と外した回答で工数浪費。
0080デフォルトの名無しさんNGNG

「A Comparative Study of Language Support for Generic Programming」
という題の論文がちょっと前に SIGPLAN に出てた。以下の言語を幾つかの視
点から比べてた。

C++
Standard ML
Haskell
Eiffel
Generic Java
Generic C#

論文曰く、結局 Haskell が一番良さげなんだそーだ。その次は Standard ML ね。
0081デフォルトの名無しさんNGNG
> 全てのオブジェクトは、関数型言語の部分計算キャッシュに過ぎないIという信念を持って
> OOしてる漏れには、なんか気になるフレーズですた。
そういうのを手続き指向という。
オブジェクト指向の世界観は、もっとステートフルで順序的で、
拡張性・互換性のためなら副作用大歓迎という文化。
0082デフォルトの名無しさんNGNG
>>81
おにぃさん、今、研究機関の研究テーマの流行りは、
Statelessな関数型言語(ML,Haskel,Clean,etc.)で確立した型システムの扱いを、
Javaを始めとするオブジェクト指向言語の型システム(クラス)へと適用/拡張することなんですよ。
0083デフォルトの名無しさんNGNG
そして、オブジェクトを関数言語の部分計算と見ることで、
関数言語の型システムで、オブジェクト指向の型システム(クラス)を説明できるようになり、
最終的には、オブジェクト指向言語の型システム(クラス)について、フォーマルな取り扱いがしやすくなるんでわ?
つうのが、漏れの信念です。

でも、こーゆーのって、米澤県とかMSRあたりのキラ星研究者がやってるテーマな気がする。。。
0084デフォルトの名無しさんNGNG
>>82
その「研究機関の研究テーマ」ってのは何だ?(w
0085デフォルトの名無しさんNGNG
オレオレ
0086デフォルトの名無しさんNGNG
>>85
おまえが研究機関か!
あれほど裏の空き地で野球を(ry
0087デフォルトの名無しさんNGNG
つか、素人向けに現在のトレンドを説明したつもりなんだけど、
なんで一々絡んでくるの?だから素人は嫌いだ。
0088デフォルトの名無しさんNGNG
ニヤニヤ
0089デフォルトの名無しさんNGNG
話の本筋ではなく、重箱の隅をつついて、
相手に丁寧な説明を要求しちまうような、
礼儀知らずで無作法な厨房って多いよな。
俺はそういう厨房が、大嫌いだ。

今も、大岡山近くの事務所(誰だよ番頭は?)から、
その手の厨房が俺の席前に出張ってきていて、
対応に困ってる。

こっちの言うこと全然聞かねぇで反論ばっかりだし(口癖は聞いて下さいよ〜)し、
メールで返事しろつっても、非難するような口調で一々口頭で質問してくるし、
忙しいから出来るか出来ねぇかまず答えろつっても、じくじく質問してきやがって、
挙句の果て、ここまで説明すりゃーどんな厨房でも出来るだろ、っつう説明をし終えると、
今度は「そんなことやっても意味がないです」ブチッ

てめぇの趣味聞いてんじゃねぇんだよ、仕事だからやれよ。
自分で方法も思いつかず、忙しい人様の時間を浪費して質問してくるなら、
さっさと実装しろよ。方法を人に聞いて、自分勝手に結論出して意味がねぇって、おまえ何様?
ふつ〜、そ〜ゆ〜無作法な奴って、卒業研究か博士課程でゴリゴリ削られて丸くなるもんなんだけど、
その程度の訓練もできてないヤシが、なんで大口叩くの?40も近くなって。お子様ですか?

と、ゆーような、アフォに心乱される日々を送る、2004年春の夜。

0090デフォルトの名無しさんNGNG
結論はCleanのGenericマンセー
ってこったな。
0091デフォルトの名無しさんNGNG
いまこのスレでなにが話されているか、
俺にもわかるように教えてください。
0092デフォルトの名無しさんNGNG
(・∀・) ニヤニヤ
0093デフォルトの名無しさんNGNG
>>89
君ももうちょっと大人になればいいのに。
0094デフォルトの名無しさんNGNG
プロマネ業務経験者の立場から言わせてもらうと、
・虚偽の報告をする奴
・分担作業者間のすり合わせをのらりくらり逃げる奴
・ぷろぱの指示聞けない外注さん
は、居なくていいか、と。
俺がこんなこと言わにゃならんとはな〜、世も末だなこりゃw
老婆心ながらアドバイスしとくと。
・報告やすり合わせの場で、あんま反論ばっかりすると、
 プロジェクトが荒れるから、もうちょっと反論の方法を考えた方が良いよ。
 口頭でつじつまの合わない逃げを打つと、ボロクソに叩かれるのが道理。
 それでも自分に理があると思うなら、冷静にメールで事実を伝えてはどうよ。
 CCで自分と相手の上司にもCC打つのは基本動作。
 ようするに、口頭でツマラン喧嘩する暇があったら、自分も相手も逃げ場のない方法で
 きちんとした誠実な議論をして呉れっつう事。それが、正しい問題解決の方法だよん。

0095デフォルトの名無しさんNGNG
・自分の指示系統の外のぷろぱに、全部責任押し付ける、
 不合理外注も(゚д゚)イラネ、ペッ
0096デフォルトの名無しさんNGNG
外注に、真実を報告する価値を認められない、
独善的終了済プロ真似の愚痴はこちらで http://life4.2ch.net/yume/
0097デフォルトの名無しさんNGNG
>>96
いみ、ふめいですぅ〜☆
0098デフォルトの名無しさんNGNG
で?
0099デフォルトの名無しさんNGNG
土曜日の晩 17:00にageたスレが、未だにスレ位置34か。

この板の過疎っぷりも、ひどいな。
ここ数年、気違いが荒らしまくってるのを放置した結果が、このザマか。
0100デフォルトの名無しさんNGNG
なんていうか、「関数型言語」に反応して荒らしてる奴が約2名いるな・・・
0101デフォルトの名無しさんNGNG
>>84を軽く流せない>>82もかなり低能な気が…
0102デフォルトの名無しさんNGNG
相手の話の本筋をまるっきり無視して、
興味本位に重箱の隅をつついた質問を繰り返す、
そんな厨房が、私は大嫌いだ。

呆れ返った相手が、同情心で莫迦っ丁寧な説明をしてくれるのを見て、
「そんな幼稚な事は判り切ってるよ、アフォ」とか、
「アフォを煽って、うまく情報を聞き出したぞ」とか
「知的でクールな駆け引きをして情報を入手した」とか
ゆーよーな態度を取る厨房が、死ぬほど嫌いだ。

おまえら、ヴァカでアフォで格下だから、そんな態度が許されるんだぞ。
おまえらが、おまえらより格下にそんな態度とったら、アフォ扱いされるんだぞ。
そんな態度とる奴は、
「私はヴァカなガキなんで、丁寧にものを尋ねるマナーすらありません」
って首から看板ぶら下げて歩いてるくらい、みっともないんだぞ。

ただし、ヴァカでアフォでガキなおまぃらは、ヴァカでアフォでガキだから、
そーゆー未熟な態度しかとれない事はわかってる。遠慮なく、ヴァカでアフォでガキな態度でもがく事を特別許す。
だけど、とってもウザいから、とにかく早く成長しろ。おながいします。
0103にゃーごNGNG
春だね。発情期だね。
0104デフォルトの名無しさんNGNG
>>102
どこを縦読み?
0105デフォルトの名無しさんNGNG
>>104
http://pc5.2ch.net/test/read.cgi/tech/1083734838/ ;の1だろ。
0106厨でーすNGNG
下寝りっくぷろぐらみんぐって、
単にみんなObject型(型継承木のルート)で扱うのと、なんが違うの?(型間違いのチェックを除いて)

「どうだ、これが下寝りっくぷろぐらみんぐだ」!見たいな
サンプルコードない?
0107デフォルトの名無しさんNGNG
そんなことしたら、Object型が闇鍋になってしまうじゃない。
手に入りやすいところでtype_traits辺り読んでみてね。
0108厨でーすNGNG
>>107
とんくすこ。それって、
http://www.boost.org/libs/type_traits/ の Example code のこと?
++読めないけど読んでみますた。
げねりっくって、コンテナ系に強いっていうか、
なんでも(?)コンテナベースで書くのが流儀なの?
コンテナを発想の中心に据えてコードを書くのかな?それって一般的に可能なの?
(Type Trait自体はリフレクションでいいかなとか思っちゃうけど(速度がメリットな訳じゃないよね?))
0109デフォルトの名無しさんNGNG
C++で最初に追求した人がcontainerでやったから
containerで一番発達しています。

traitsっていうくらいで、
型システムをうまく使った脱闇鍋ぶりをみてね。
0110デフォルトの名無しさんNGNG
とどのつまり、Generic Programmingのメリットとは、
型の気持ちよさが維持できる、ということですかい?

全部Objectで書いて気にならない剛の者、あるいは
静的型がない言語では別段うれしくはない?
0111デフォルトの名無しさんNGNG
意味不明なリファレンスの書き方をするのが、最近の流儀なの?

学がない人の知ったかぶりって、やーねぇ
0112デフォルトの名無しさんNGNG
type_traits:
 C++ STL方面(Boosts C++ Library ?)で
 Template引き数の型特性情報(voidとかpointerとか)
 をランタイム情報として持たせる
って話か。いかにもC++って感じだね。

>>30近辺で型パラメータ(仮引数)だtype class(実引数)だ、って言ってる話の派生ね。
で、>>107-108は一体何を言ってるの?
0113デフォルトの名無しさんNGNG
>>110
おれもあんまわかってないけど、それは違うと思われ。
http://www.mamezou.com/tec/Tips/jsgl/

Genericsってのは、*事実上*、汎用的なコンテナと汎用的なイテレータで
汎用的にごにょごにょするのをいうのではないかと。
そういう意味で、Javaではもともと可能な訳で、
J2SE5.0で追加の、erasureによる「Generics」はホントはgenericsではなくて、
気持ちよさの味付けに過ぎない、とか言ってみるテスト。
0114デフォルトの名無しさんNGNG
>>30-31>>107-108だろ。
つまんない知ったかぶりで話を脱線させる特性が共通してるYO
0115デフォルトの名無しさんNGNG
>>110,>>113
 あの〜w
 まめぞの記事リファレンスに出すくらいなら、
 もっと皆に分かりやすく説明したらどうだろね。

 >>110が主観的すぎて第三者に意味不明、
 それにレスする>>113はもっと意味不明。

 要するに、Java Genericは普通のGenericじゃねぇよ、と知ったかしたいのですね :-)
0116デフォルトの名無しさんNGNG
>>113
どーでもいーや。あんたの発言。
夜中にいみふめな即レスつける厨はすっこんでろ、と。
0117デフォルトの名無しさんNGNG
賢くて造詣が深くていらっしゃるようですので、意味不明なんていわないで、
突っ込みどころをきちんと突っ込んでくれれば話は進むのですが。
0118デフォルトの名無しさんNGNG
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1076074304&res=14&fi=no
一応こういうのも作れたり。
0119デフォルトの名無しさんNGNG
>>118
それもGenericProgramingなの?
0120デフォルトの名無しさんNGNG
メンヘラー1が発生しますた。
場所は>>114=>>115=>>116です。
 OKで終了
 キャンセルでデバッグ
[OK] [キャンセル]
0121デフォルトの名無しさんNGNG
「とどのつまり、Generic Programmingのメリットとは、
 型の気持ちよさが維持できる、ということですかい?

 全部Objectで書いて気にならない剛の者、あるいは
 静的型がない言語では別段うれしくはない? 」

ってのは、生半可な厨房に言える言葉ではないな。
究極の厨房、至高のDQS、とにかく視野が狭すぎ。
C++ばっかやんないで、スクリプト系言語やプロトタイピングベースのOO
にでも手を出して、視野を広めてきなさい、ってこった。
0122デフォルトの名無しさんNGNG
究極でも歯垢でも何でもいいから、具体的な突っ込みを書けよ。
しかし、プロトタイピングベースのOOってのは初めて聞いたな。
0123デフォルトの名無しさんNGNG
厨房に突っ込んだら捕まるからいやん
0124デフォルトの名無しさんNGNG
> Genericsってのは、*事実上*、汎用的なコンテナと汎用的なイテレータで
> 汎用的にごにょごにょするのをいうのではないかと。

Genericsって、用途というか適用範囲は限られてるんだね。
OOみたいなもっと一般的な考え方かと思ってた。
0125デフォルトの名無しさんNGNG
C++なんかのgenerics程度でわかったような気になってるやつは
関数型言語の「多相型」についてもっと勉強した方がいいよ。
0126デフォルトの名無しさんNGNG
> 関数型言語の「多相型」

それって、コンテナとイテレータ(イテレーション)でごにょごにょとは
全然違って、Genericsを一般的な技法にしてくれるもの?
0127デフォルトの名無しさんNGNG
>>126
> それって、コンテナとイテレータ(イテレーション)でごにょごにょとは

C++だって、そうじゃない。

話っぷりがアホっぽくて、相手したくないから、
"Modern C++ Designe"でも読んでくれ。
0128デフォルトの名無しさんNGNG
>>127
アホはおめーだろwww.co.jp
0129デフォルトの名無しさんNGNG
>>126
コンテナもイテレーションも関係ない。
0130デフォルトの名無しさんNGNG
一言でいうと、ストローのようなもの
0131デフォルトの名無しさんNGNG
ストロー??(@_@)??
その心は?
0132デフォルトの名無しさんNGNG
ちゅーっ
0133デフォルトの名無しさんNGNG
虎のGenericsって↓とかってどうなんのよ?
とくにEndUserだけあとでコンパイルしたら。

public class Holder<T> {
T value_;
public Holder(T t) { value_ = t; }
public T value(T t) { return value_; }
}

public class IntegerHolderUser {
void method( Holder<Integer> holder ){....;}
}

public class EndUser {
void hoge(IntegerHolderUser iu){
....;
iu.method(new Holder<String>("Unko"));//★
....;
}
}
0134デフォルトの名無しさんNGNG
>>133
試しもせずに聞く奴はウンコ。
> EndUser.java:3: method(Holder<java.lang.Integer>) (IntegerHolderUser 内) を (Hol
> der<java.lang.String>) に適用できません
> iu.method(new Holder<String>("String"));
> ^
> エラー 1 個
0135ウンコNGNG
とんくすこ。
クラスファイルは今までと変わらなくて、
実体はみんな只のObject(か制約してるinterface)+ キャスト、ってのはガセか?
これって、classファイルにしっかり特殊化したパラメタの型データが埋め込まれてるって事だよな?
0136デフォルトの名無しさんNGNG
>>135
そーゆーのが知りたきゃ、横着しないでちゃんと仕様読めよ。

http://java.sun.com/developer/earlyAccess/adding_generics/
でダウンロードできる adding_generics-2_4-ea.zip 内にある文書とか、
http://www.jcp.org/en/jsr/detail?id=202 とか。
0137デフォルトの名無しさんNGNG
>>134みてトライしたが、TypeList書けね。書けんの?
0138デフォルトの名無しさんNGNG
>>121
このおっさん何言ってんだ?あふぉ?
Genericプログラミングは、型についてGenericなプログラミングなんだから、
「」が言ってることはあってるだろ。
0139デフォルトの名無しさんNGNG
当たり前すぎるからいってると思われ。


0140デフォルトの名無しさんNGNG
Tiger preFCSリリース記念age。
0141デフォルトの名無しさんNGNG
だれもやってないの?
0142デフォルトの名無しさんNGNG
テンプレート関連のスレが他にあるから。
0143デフォルトの名無しさんNGNG
++だけかぁ。 (´・ω・`)ショボーン
0144デフォルトの名無しさんNGNG
>>143
別に言語なんて何だっていいんだけどね。
0145デフォルトの名無しさんNGNG
>>144
だったらこのスレ盛り上げてけろ。
0146デフォルトの名無しさんNGNG
「generic」という言葉の意味を考えると、コンテナ+アルゴリズムだけではなく、
ストリームもgeneric programmingじゃないんだろうか。
ファイル・標準入出力・メモリ(文字列)などを一般化して扱っているのだから。
0147デフォルトの名無しさんNGNG
ちょっと研究に飽きたので書きこ。専門的には、大雑把にわけると

parametric polymorphism ≒ C++のテンプレート ≒ JavaのGenerics
generic programming == polytypic programming(呼び方が変わっただけ)

だな。

前者はMLとか大昔からあって、まあコンテナがメインだよな。
たとえば二分木を実装したいときに「整数の二分木」「浮動小数の二分木」
「文字列の二分木」とか、要素の型ごとに別々に実装するのが無駄なので、
「…の二分木」の…の部分をパラメタライズできる機構を導入したわけだ。

後者はまだ新しくて、「木にもリストにも組にもグラフにも集合にも
適用できる関数を定義」とか、もう1段上の一般化。
そこまで一般的に定義できるとうれしい関数としては、
シリアライザとかpretty printerとか=(構造等値)とか。

前者は明らかに役に立つが、後者はまだ用途が限定されてて何とも言えん
と俺は思う。
0148& ◆D3ra0B2LiQ NGNG
で、parametric polymorphismというかJavaのGenericsについては
「要素の型をObjectにすればいいじゃん!」と思うかもしれんが、
そうすると取り出した要素をダウンキャストしないと
ほとんど何もできなくて、コンパイル時型チェックの有難さが
減ってしまう。実行時に「クラスが違うからダウンキャストできないよー」と
言われてしまう(かもしれない)わけだ。

もちろん、誰かが言ってたがコンパイル時型チェックのない言語だったら
そもそもparametric polymorphismなんて不要というか意味がない。

polytypic programmingも、コンパイル時型チェックのない言語なら
普通は自明に実現できるので、やはりあまり意味はない。
0149デフォルトの名無しさんNGNG
あれ、名前がすげー文字化け…

たまにしか書かないので許してちょ
0150デフォルトの名無しさんNGNG
全然わけわからん、そもそも>>147的な分類自体が意味不明・・・
大体、Ada83の昔から、genericは後者を明らかに志向していたし
無論AdaのGenericを手本にしたC++のtemlateも
STLなんかを見れば明らかに後者を志向している
0151デフォルトの名無しさんNGNG
>>147
ちょっとちょっと
> 後者はまだ新しくて、「木にもリストにも組にもグラフにも集合にも
> 適用できる関数を定義」とか、もう1段上の一般化。
が役に立つかどうか言えないなんて、世間ずれしすぎ…
0152& ◆l.EoaDddmI NGNG
>>151
じゃあそういうpolytypicな関数で役に立つ例を、できるだけ多く挙げてくれ。
0153147NGNG
>>150
たとえばAdaのgenericsでもC++のテンプレートでもいいが、
木とかリストとかペアとか任意のデータ型に適用できるpretty printerを
どう書くの?
0154デフォルトの名無しさんNGNG
必死だな
0155147NGNG
ちなみにgeneric programmingとgenericsの区別がつかない人は

http://www.cs.uu.nl/research/projects/generic-haskell/

でも見てね。
0156デフォルトの名無しさんNGNG
>>147
findとかfor_eachって、後者に入るのでしょうか?
それとも全然見当はずれなのかな。
0157156NGNG
>>155
どもも。読んでみます。
0158156NGNG
見当はずれの気がしてきた。
なぜなら、findやfor_eachを*作る*のはgeneric programmingだが、
*使う*のはまた別の話。
0159147NGNG
あースマソなんかHaskellとか関数型言語でいうgeneric programmingと
OOでいうgeneric programmingが食い違ってるような気がしてきた。
狭義と広義っていうか。googleしてみたら半々ぐらいっぽい。
勉強になりますた。出直してきます。
0160156NGNG
>>159
そんなん言わんと、専門の立場からもっといろいろ発言しておくれ。
あと、食い違った部分について軽く説明しておいてくれると、読んでる側として勉強になる。
0161デフォルトの名無しさんNGNG
Java厨に言わせると、
きちんとinterfaceベースで設計すればよいだけでは?
JDK5のGenericsだってOjbectで扱う、コンテナ以外の使い道三塚欄。
0162デフォルトの名無しさんNGNG
>>161
まず、まともな日本語で書け。意味が分からん。
それから、そういう次元の話はしていない。
0163英語毎回追試NGNG
Java junkies say,
it is satisfied by correct desinging with 'interface'. is't it?
Generics introdused to J2SDK5.0 seems to be only useful for containers
that need hadling 'Object's.

0164デフォルトの名無しさんNGNG
genericな設計にするときにUMLなんかでは書けないよね。
設計を図にしたいときってどうするの?
0165デフォルトの名無しさんNGNG
総称的クラスに対しての操作を通常のクラスに対するものと同様に扱えばいいと思うけど。
0166デフォルトの名無しさんNGNG
>>155
Generic Haskelは、CLOS的な総称関数をHaskelにtype safeなまま持ち込む試み。
Dynamic typingも含む。

どっちかつーと、CLOS, C++(with typeid)の後追いかな。
もちろん理論部分で頑張ってるけども。
0167147NGNG
>>160
現在の自分の理解…

OOでいっているgeneric programmingは、MLとか関数型言語でいう
parametric polymorphismのことで、C++のテンプレートとか
Javaのgenericsが実現の一例。intのtreeと、floatのtreeと、
stringのtreeと…を「Xのtree」みたく、型について一般化された
型や関数を定義できる。

Haskellとか関数型言語(プログラミング言語基礎理論のコミュニティ?)でいう
generic programmingは、polytypic programmingと同義で、treeにもlistにも
pairにも適用できる関数を「定義」するための機構。>>156もいっているように、
foreachとかmapとか別々に定義して「使用」することは大抵の言語で可能だけど、
そうではなくて、まとめて定義するってことね。テクニカルにいうと、
型(intとかfloatとかstringとか)について一般的なだけでなく、
型演算子(listとかtreeとか)について一般的な定義ができる。

ついでにソフトウェア工学あたりだと、とにかく超広義に「一般的なプログラムを
書くための仕組み」を何でもgeneric programmingとか言っている人もいる。

ってな感じで合ってる?
0168147NGNG
>>166
あー、C++のテンプレートはいろいろとくっついてるから、一概に
parametric polymorphismだけとはいえないのね。なるほど。

ちなみにCLOSの総称関数ってどんなの?
0169147NGNG
参考文献?

http://en.wikipedia.org/wiki/Generic_programming
0170デフォルトの名無しさんNGNG
>>168
C++と同じくコード共有はあまり気にしない流儀。
http://www.lisp.org/HyperSpec/Body/mac_defgeneric.html

Generic Haskelは、dynamig typing使って、
コード(というか定義)共有頑張るんでしょ? (違うのかな?)
Java genericsやC#のboxing/unboxingみたいに。

structural polymorphismってのは、
C++でいうところのtraitやconceptを入れたポリモなのかな?
0171デフォルトの名無しさんNGNG
>>170
> Java genericsやC#のboxing/unboxingみたいに。

auto-boxing/unboxingね。
0172デフォルトの名無しさんNGNG
>>168
こんな感じ。
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_149.html
0173デフォルトの名無しさんNGNG
マクロベースでなんとかならなかったのかなーと思って
妄想書いてみた
(define-macro (hoge . body)
 (let ((x (gensym)))
  `(let ((,x 1))
   (hage ,x (car body)) (set! ,x 2) (mage ,x ,@(cdr body)))))

#define hoge(#rest body) \
 { int #gensym x = 1; \
  hage(#unquote x, #first body); \
  #unquote x = 2; \ mage(#unquote x, #unquote_splicing #rest body); }

hoge(a,bc)

{ int g01__x = 1;
 hage(g01__x, a); g01__x = 2; mage(g01__x, b,c); }

#define_syntax for_each #var o #var proc in #var seq ; \
 { #unquote seq.type #gensym x = #unquote seq; \
  for (; #unquote x; ;#unquote x = #unquote x.next()) { \
   #unquote x.data.type #unquote o = #unquote x.data; \
   #unquote proc}}

for_each z printf("data = %a",z); in strlist;

{ string_list_t g02__x = strlist;
 for (g02__x; g02__x = g02__x.next()) {
  string_list_data_t z = g02__x.data; printf("data = %a",z); }}

やっぱ型がネックだなー
やはりC++の選択は正しかったのか。
0174デフォルトの名無しさんNGNG
>>173
C++のテンプレートは構文マクロだからな。

どうでもいいがJava Genericsには日本人の貢献もでかいな。
■ このスレッドは過去ログ倉庫に格納されています