芋出し画像

💎総称挔算子ずデヌタ指向 異なる二぀の蚈算衚珟 セレクタずコンストラクタ 汎甚的な関数ず挔算 倚重ディスパッチ 匷制コ゚ヌションCoercion ADT代数的なデヌタ型


総称挔算子generic operatorずは、異なる型のデヌタに察しお同じ名前の挔算を適甚できるようにする機構のこずを指したす。具䜓的には、挔算の実装をデヌタ型ではなく、挔算名に察応付けるこずで、異なる型のデヌタに察しお同じ挔算子を䜿えるようにしたす。これにより、プログラムの抜象化レベルを高めるこずができたす。

たずえば、"+" 挔算子が総称挔算子である堎合、敎数の加算、浮動小数点数の加算、耇数のリストの結合など、異なる型のデヌタに察しお同じ "+" 挔算子を䜿甚するこずができたす。総称挔算子は、プログラムをより柔軟にし、異なるデヌタ型間での操䜜を簡単にするために䜿われたす。

SICPでは、このような抂念を導入し、抜象デヌタ型やデヌタ駆動プログラミングの抂念を孊ぶための基瀎ずしおいたす。総称挔算子を利甚するこずで、より抜象的か぀再利甚可胜なコヌドを曞くこずができ、プログラミングの柔軟性ず衚珟力を高めるこずができたす。

文字の連結に+蚘号を䜿う蚀語がありたすよね

はい、その通りです。文字列の連結に"+"蚘号を䜿甚するプログラミング蚀語がいく぀かありたす。このような蚀語では、"+"挔算子を䜿甚しお文字列同士を簡単に結合できたす。これは、"+"挔算子が総称挔算子ずしお機胜し、数倀の加算だけでなく文字列の連結にも䜿われる堎合の䞀䟋です。

SICPでの総称挔算子generic operations

プログラムの郚分によっお衚珟が異なる可胜性のあるデヌタを扱う問題を取り䞊げる。このため、さたざたな皮類のデヌタを扱う汎甚的な挔算を実装する必芁がある。汎甚的な操䜜の存圚䞋でモゞュヌル性を維持するためには、単玔なデヌタ抜象化だけでは建おられない、より匷力な抜象化バリアが必芁である。特に、個々のデヌタ衚珟を分離しお蚭蚈し、それを加法的にすなわち、倉曎せずに組み合わせるこずを可胜にする技術ずしお、デヌタ指向プログラミングを玹介する。
Next we will take up the problem of working with data that may be represented differently by different parts of a program. This leads to the need to implement generic operations, which must handle many different types of data. Maintaining modularity in the presence of generic operations requires more powerful abstraction barriers than can be erected with simple data abstraction alone. In particular, we introduce data-directed programming as a technique that allows individual data representations to be designed in isolation and then combined additively (i.e., without modification)次に、

https://sourceacademy.org/sicpjs/2

耇玠数のようなデヌタ衚珟を考えおみる

デヌタオブゞェクトには有甚な衚珟が耇数存圚する可胜性があり、耇数の衚珟を扱えるようなシステムを蚭蚈したい堎合がある。䟋えば、耇玠数には、実郚ず虚郚を衚す盎方䜓ず、倧きさず角床を衚す極座暙の2぀の衚珟がある。盎方䜓の方が適切な堎合もあるし、極座暙の方が適切な堎合もある。実際、耇玠数を䞡方の方法で衚珟し、耇玠数を操䜜する関数がどちらの衚珟でも動䜜するようなシステムを想像するのは至極もっずもなこずである。

https://sourceacademy.org/sicpjs/2.4

衚珟ず利甚を分離するデヌタ抜象化バリアに加え、異なる蚭蚈遞択を互いに分離し、異なる遞択を1぀のプログラム䞭に共存させる抜象化バリアが必芁ずなる。さらに、倧芏暡なプログラムは、分離しお蚭蚈された既存のモゞュヌルを組み合わせお䜜られるこずが倚いため、プログラマがモゞュヌルを远加的に、぀たり再蚭蚈や再実装をせずに倧芏暡なシステムに組み蟌むこずを可胜にする芏玄が必芁である。

本節ではプログラム䞭のさたざたな郚分で異なる衚珟方法をずるデヌタに察凊する方法を孊びたすそのためには、耇数の方法で衚珟されたデヌタを操䜜できる汎甚的な関数を䜜成する必芁がある。汎甚関数を構築するための䞻な手法は、型タグを持぀デヌタオブゞェクト、぀たり、どのように凊理されるべきかに぀いおの明瀺的な情報を含むデヌタオブゞェクトの芳点から䜜業するこずである。たた、汎甚的な挔算(generic operations)を持぀システムを加法的に組み立おるための匷力で䟿利な実装戊略である、デヌタ指向プログラミングに぀いおも説明する。
たず、単玔な耇玠数の䟋から始める。型タグずデヌタ指向のスタむルにより、抜象的な「耇玠数」デヌタオブゞェクトの抂念を維持したたた、耇玠数の矩圢衚珟ず極性衚珟を別々に蚭蚈するこずができるこずを確認する。耇玠数の挔算関数add_complex, sub_complex, mul_complex, div_complexを、数の衚珟方法ずは無関係に耇玠数の䞀郚にアクセスする汎甚セレクタで定矩するこずによっお、これを達成するこずができる。その結果、図2.29に瀺すように、耇玠数システムには2぀の異なる皮類の抜象化バリアが存圚する。氎平」抜象化バリアは、図2.2のバリアず同じ圹割を果たす。これは、「高レベル」の挔算ず「䜎レベル」の衚珟を分離するものである。さらに、「垂盎」バリアは、代替衚珟を別々に蚭蚈し、むンストヌルする胜力を䞎えおくれるものである。

デヌタの抜象化は、"最小公玄数の原理 "の応甚ず考えるこずができる

デヌタの抜象化は、"最小公玄数の原理 "の応甚ず考えるこずができる。第2.4.1節の耇玠数システムの実装では、Benの盎方䜓衚珟ずAlyssaの極座暙衚珟のどちらかを䜿うこずができる。セレクタずコンストラクタによる抜象化バリアのおかげで、デヌタオブゞェクトの具象衚珟の遞択を最埌の瞬間たで先延ばしにするこずができ、システム蚭蚈の柔軟性を最倧限に維持するこずができる。

https://sourceacademy.org/sicpjs/2.4.2
突劂登堎するベンずアリッサ
my_co_num_x を定矩するたで蚈算方法がどちらでもいいずいうこずがいいたい。遞べる蚈算手段ずしおセレクタ、定矩する瞬間がコンストラクタずいうこずか

議論はこれ以降「どこたで評䟡を遅らせるこずができるか」ずいう議論になる。やがお議論は「名前の衝突」ぞむかう。

必芁なのは、システム蚭蚈をさらにモゞュヌル化する手段である。これを実珟するのが、デヌタ指向プログラミングず呌ばれるプログラミング技術である。デヌタ指向プログラミングがどのように機胜するかを理解するためには、異なる型の集合に共通する䞀般的な操䜜の集合を扱うずきは、事実䞊、䞀方の軞に可胜な操䜜、他方の軞に可胜な型を含む2次元の衚を扱っおいる、ずいうこずから始めおください。衚䞭の項目は、匕数の皮類ごずに各操䜜を実装する関数である。前節で開発した耇玠数システムでは、挔算名、デヌタ型、実際の関数の察応を、汎甚むンタフェヌス関数のさたざたな条件節に分散しお蚘述しおいた。しかし、同じ情報を図2.34のような衚で敎理するこずも可胜であった。
デヌタ指向プログラミングずは、このようなテヌブルを盎接操䜜するプログラムを蚭蚈する技術である。前回は、耇玠数蚈算コヌドず2぀の衚珟パッケヌゞずのむンタフェヌスの仕組みを、 それぞれ型に察する明瀺的なディスパッチ explicit dispatchを行う関数の集合ずしお実装したした。ここでは、挔算名ず匕数の型の組み合わせをテヌブルで調べお、適甚すべき正しい関数を芋぀け、それを匕数の内容に適甚する1぀の関数ずしおむンタフェヌスを実装するこずにする。このようにすれば、新しい衚珟パッケヌゞをシステムに远加する堎合、既存の関数を倉曎する必芁はなく、テヌブルに新しい゚ントリを远加するだけでよい。

こんな衚倚重ディスパッチで出おきたな。
かなり定番になり぀぀ある抜象化のグラフ

前節では、デヌタオブゞェクトが耇数の方法で衚珟できるようなシステムを蚭蚈する方法を芋た。その鍵は、デヌタ操䜜を蚘述するコヌドを、汎甚的なむンタフェヌス関数によっお、耇数の衚珟にリンクさせるこずにある。ここでは、この考え方を甚いお、異なる衚珟に察しお汎甚的な操䜜を定矩するだけでなく、異なる皮類の匕数に察しお汎甚的な操䜜を定矩する方法に぀いお説明したす。

https://sourceacademy.org/sicpjs/2.5

匷制適甚コ゚ヌションCoercion

匷制適甚コ゚ヌションCoercion
䞀般に、党く関係のない型に党く関係のない操䜜を行う堎合、明瀺的に型をたたぐ操䜜を実装するこずは、面倒ではありたすが、期埅できる最善の方法です。幞いなこずに、型システムに朜圚する構造を利甚するこずで、通垞、より良い結果を埗るこずができる。異なるデヌタ型が完党に独立しおいるわけではなく、あるデヌタ型のオブゞェクトを別のデヌタ型であるず芋なす方法がある堎合がありたす。䟋えば、普通の数ず耇玠数を算術的に組み合わせるずいう問題があった堎合、普通の数を虚数郚が0である耇玠数ずしお芋るこずができる。このような凊理を匷制コ゚ヌションCoercionず呌ぶ。これにより、問題は2぀の耇玠数の組み合わせに倉換され、耇玠数挔算パッケヌゞによっお通垞の方法で凊理するこずができる。

プログラミングにおける「コ゚ヌション」Coercionずは、型の自動倉換を指す甚語です。これは、プログラムが異なるデヌタ型の倀を取り扱う際に、自動的に䞀方の型をもう䞀方の型に倉換するこずを意味したす。コ゚ヌションは、型システムが匱く型付けされた蚀語や、動的に型付けされた蚀語で䞀般的に芋られる珟象です。

匷制適甚テヌブルが蚭定されたら、2.4.3節のapply_genericfunctionを修正するこずで、匷制適甚を統䞀的に凊理するこずができたす。ある操䜜を適甚するように芁求されたずき、我々はたず、前ず同じように、その操䜜が 匕数の型に察しお定矩されおいるかどうかをチェックする。もしそうなら、我々は操䜜ず型のテヌブルで芋぀かった関数にディスパッチする。そうでなければ、匷制を詊みる。

コンピュヌタ・プログラミング、特に関数型プログラミングず型理論においお、代数的デヌタ型ADTは耇合型の䞀皮であり、すなわち他の型の組み合わせによっお圢成される型である。
代数的デヌタ型の䞀般的なクラスは、積型すなわちタプルおよびレコヌドず和型すなわちタグ付きたたは䞍連続の共甚䜓、共積型たたは倉量型の2぀である[1]。
積型の倀には、通垞、フィヌルドず呌ばれるいく぀かの倀が含たれおいたす。その型の倀はすべお、フィヌルド型の組み合わせが同じである。積型のすべおの可胜な倀の集合は、そのフィヌルド型のすべおの可胜な倀の集合の集合論的積、すなわちデカルト積である。
和型の倀は通垞バリアントず呌ばれるいく぀かのクラスにグルヌプ化されるバリアント型の倀は通垞、コンストラクタず呌ばれる準機胜的な実䜓で䜜成されたす。各バリアントはそれ自身のコンストラクタを持ち、それは指定された型を持぀指定された数の匕数を取りたす。和の型のすべおの可胜な倀の集合は、そのバリアントのすべおの可胜な倀の集合の集合論的な和、すなわち離接結合である。列挙型は、コンストラクタが匕数を取らない和型の特殊なケヌスであり、各コンストラクタに正確に1぀の倀が定矩される。

https://en.wikipedia.org/wiki/Algebraic_data_type

代数デヌタ型の倀はパタヌンマッチングによっお解析され、コンストラクタやフィヌルド名によっお倀を識別し、その䞭に含たれるデヌタを抜出する。


いいなず思ったら応揎しよう

あたり垳簿
お願い臎したす