(57)【要約】  本開示は、ラムダ式と、命令型のおよび／またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。ラムダ式は、コード指定のより簡潔で機能的な形を提供するためにメソッドと共に（例えば、引数、割当．．．）使用することができる。さらに、ラムダ式は、とりわけ、型推論および型チェックならびにオーバーロード解決に加わることができる。
2009505174.tif 000002
【特許請求の範囲】
【請求項１】
ラムダ式に関連するコンテキスト情報を入手するコンテキストコンポーネントと、
前記コンテキストコンポーネントによって供給される前記コンテキスト情報に基づいて、前記ラムダ式に関連する型を推論する推論コンポーネントと
を含むことを特徴とするコンピュータプログラムコンパイルシステム。
【請求項２】
暗黙のうちにおよび／または明示的に型指定される０個以上のパラメータと本体とを含むラムダ式の指定を容易にする開発コンポーネントをさらに含むことを特徴とする請求項１に記載のシステム。
【請求項３】
前記ラムダ式は、｜パラメータ｜本体、｜｜＝本体、パラメータ＝＞本体、（パラメータ）＝＞本体、パラメータ＝＝＞本体、および（パラメータ）＝＝＞本体のうちの１つの形であることを特徴とする請求項２に記載のシステム。
【請求項４】
前記本体は、式およびステートメントブロックのうちの１つを含むことを特徴とする請求項３に記載のシステム。
【請求項５】
前記コンテキストコンポーネントは、前記ラムダ式が割り当てられる関数からコンテキスト情報を取り出すことを特徴とする請求項１に記載のシステム。
【請求項６】
前記推論コンポーネントは、前記推論された型を検証するために、前記関数の戻り型を前記ラムダ式の戻り型と比較する検証コンポーネントを含むことを特徴とする請求項５に記載のシステム。
【請求項７】
前記関数は、ｄｅｌｅｇａｔｅ型およびジェネリックｄｅｌｅｇａｔｅ型のうちの１つであることを特徴とする請求項６に記載のシステム。
【請求項８】
前記コンテキストコンポーネントは、ラムダ式パラメータクラスからコンテキスト情報を取り出すことを特徴とする請求項５に記載のシステム。
【請求項９】
推論された型を１つまたは複数の明示的な型と比較し、前記明示的な型が前記推論された型と一致しない場合にエラーを生成する型チェッカコンポーネントをさらに含むことを特徴とする請求項１に記載のシステム。
【請求項１０】
前記ラムダ式およびオーバーロードされるメソッドのパラメータが同一である場合に、前記ラムダ式の戻り型に基づいてオーバーロードされるメソッドを選択する選択コンポーネントをさらに含むことを特徴とする請求項１に記載のシステム。
【請求項１１】
ラムダ式の電子表現およびｄｅｌｅｇａｔｅ型の電子表現が互換であるかどうかを判定することと、
前記式および前記型が互換である場合に前記ラムダ式を前記ｄｅｌｅｇａｔｅ型に変換し、そうでない場合にエラーを生成することと
を含むことを特徴とするコンピュータ実施されるラムダ式変換方法。
【請求項１２】
互換性を判定することは、前記ｄｅｌｅｇａｔｅ型を分析することを含み、前記ラムダ式およびｄｅｌｅｇａｔｅ型は、前記ｄｅｌｅｇａｔｅ型がｖｏｉｄ戻り型を有するかｒｅｆパラメータまたはｏｕｔパラメータを含む場合に非互換であることを特徴とする請求項１１に記載の方法。
【請求項１３】
互換性を判定することは、前記ラムダ式および前記ｄｅｌｅｇａｔｅ型のそれぞれのパラメータを分析することを含み、前記ラムダ式およびｄｅｌｅｇａｔｅ型は、これらが異なる個数のパラメータを有する場合および／または対応するパラメータが異なる型を有する場合に非互換であることを特徴とする請求項１２に記載の方法。
【請求項１４】
互換性を判定することは、前記ラムダ式に関連する式本体を分析することを含み、前記ラムダ式およびｄｅｌｅｇａｔｅ型は、前記式本体が同一の型を有するか前記ｄｅｌｅｇａｔｅ型の戻り型に変換可能である場合に互換であることを特徴とする請求項１３に記載の方法。
【請求項１５】
請求項１１に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【請求項１６】
メソッド引数内のラムダ式を識別することと、
前記ラムダ式の戻り型を判定することと、
前記戻り型に基づいて、オーバーロードされるメソッドのうちの１つを選択することと
を含むことを特徴とするコンピュータ実施されるオーバーロード解決方法。
【請求項１７】
オーバーロードされるメソッドのうちの１つを選択することは、前記ラムダ式と同一の戻り型を有するメソッドを選択することを含むことを特徴とする請求項１６に記載の方法。
【請求項１８】
オーバーロードされるメソッドのうちの１つを選択することは、前記ラムダ式の戻り型と互換である戻り型を有するメソッドを選択することを含むことを特徴とする請求項１６に記載の方法。
【請求項１９】
前記戻り型を判定することは、前記ラムダ式に関連するコンテキスト情報を入手することと、前記コンテキスト情報に基づいて前記戻り型を推論することとを含むことを特徴とする請求項１６に記載の方法。
【請求項２０】
請求項１６に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ラムダ式と、命令型のおよび／またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。
【背景技術】
【０００２】
プログラミング言語は、プログラマによる指定ならびに効率的実行を容易にするために進歩し続ける。コンピュータ言語の初期には、低水準マシンコードが優勢であった。マシンコードを用いる場合に、コンピュータプログラムまたはコンピュータプログラムを構成する命令は、機械語またはアセンブリ言語で記述され、ハードウェア（例えば、マイクロプロセッサ）によって実行された。これらの言語は、コンピューティングハードウェアを制御する効率的な手段をもたらしたが、プログラマが洗練されたロジックを理解し、開発するのは非常に難しかった。その後、抽象化の様々なレイヤを提供する言語が導入された。したがって、プログラマは、より高水準のソース言語を用いてより高いレベルでプログラムを記述することができ、このより高水準のソース言語は、その後、コンパイラまたはインタープリタを介して、ハードウェアによって理解される、より低水準の機械語に変換することができた。プログラミングにおけるさらなる進歩は、より高度なプログラミングロジックを以前よりはるかにすばやく指定できるようにする、抽象化の追加のレイヤをもたらした。しかし、これらの進歩は、処理コストなしでは得られない。
【０００３】
コンパイラおよび／またはインタープリタは、高水準ロジックを実行可能マシンコードに変換するという重荷を背負う。一般に、コンパイラおよび／またはインタープリタは、ソースプログラミング言語（例えば、Ｃ、Ｃ＃、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｊａｖａ（登録商標）．．．）で指定されたプログラムを受け取り、これによって与えられるロジックをハードウェアデバイスによって実行可能な機械語に変換するコンポーネントである。しかし、この変換が逐語的に行われる必要はない。実際に、従来のコンパイラおよび／またはインタープリタは、ソースコードを分析し、非常に効率的なコードを生成する。例えば、プログラマは、人間が理解するには直観的で簡単であるが、しばしばコンピュータが実行するには非効率である、動作の論理フローを示すコードを記述する。コンパイラおよび／またはインタープリタは、非効率性を識別でき、所期の結果を達成しながら、不必要な動作を除去することおよび／または命令の実行を再配置することによって、ハードウェアレベルでプログラム性能を改善することができる。この形で、プログラマは、堅牢で効率的なソフトウェアプログラムを作成することができる。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。ラムダ式は、型推論に加わることもできる。さらに、ラムダ式は、オーバーロード解決を容易にすることができる。
【課題を解決するための手段】
【０００５】
以下に、請求される主題のいくつかの態様の基本的理解をもたらすために、単純化された要約を提示する。この要約は、広範囲の概要ではない。主要な／クリティカルな要素を識別すること、または請求される主題の範囲を区切ることは、意図されていない。この要約の唯一の目的は、後で提示されるより詳細な説明の前置きとして、単純化された形でいくつかの概念を提示することである。
【０００６】
短く説明すると、提供される主題は、ラムダ式と、命令型のおよび／またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。例えば、ラムダ式は、匿名メソッドを指定する、より簡潔で機能的な形を提供することができる。
【０００７】
ラムダ式は、型推論に加わることもできる。ラムダ式自体は、型を有する必要がない。そうではなく、ラムダ式は、とりわけ、パラメータ型および戻り型を有することができる。ラムダ式の指定に関連する冗漫さを減らすために、これらの型を明示的に述べる必要はない。コンテキストに基づいてこれらの型を推論するシステムおよび方法を提供する。
【０００８】
さらに、ラムダ式は、オーバーロード解決を容易にすることができる。例えば、メソッドがオーバーロードされる場合に、ラムダ式は、特定のメソッドの選択を容易にすることができる。例えば、ラムダ式が、オーバーロードされるメソッドへの引数として使用される場合に、その式の戻り型を、特定のメソッドを選択する際の要因として利用することができる。
【０００９】
前述の目的および関連する目的の達成に向かって、請求される主題のある種の例示的態様を、以下の説明および添付図面に関して本明細書で説明する。これらの態様は、この主題を実践できる様々な形を示し、そのすべてが請求される主題の範囲に含まれることが意図されている。他の利益および新規の特徴は、図面と共に考慮される場合に、以下の詳細な説明から明白になる可能性がある。
【発明を実施するための最良の形態】
【００１０】
本発明の様々な態様を、添付図面を参照して説明するが、添付図面では、類似する符号が、複数の図面を通じて類似するまたは対応する要素を指す。しかし、図面およびそれに関連する詳細な説明が、請求される主題を特定の開示される形態に限定することは、意図されていないことを理解されたい。そうではなく、その意図は、請求される主題の趣旨および範囲に含まれるすべての修正形態、同等物、および代替形態を含むことである。
【００１１】
本明細書で使用される用語「コンポーネント」、「システム」、および類似物は、ハードウェア、ハードウェアおよびソフトウェアの組合せ、ソフトウェア、または実行中のソフトウェアのいずれであれ、コンピュータ関連エンティティを指すことが意図されている。例えば、コンポーネントは、プロセッサ上で動作しているプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行のスレッド、プログラム、および／またはコンピュータとすることができるが、これらに限定はされない。限定ではなく例として、コンピュータで動作しているアプリケーションとそのコンピュータとの両方を、コンポーネントとすることができる。１つまたは複数のコンポーネントが、１つのプロセスおよび／または実行のスレッドの中に存在することができ、１つのコンポーネントを、１つのコンピュータに局所化し、かつ／または複数のコンピュータの間で分散させることができる。
【００１２】
単語「例示的」は、本明細書では、例、実例、または例示として働くことを意味するのに使用される。本明細書で「例示的」として説明されるすべての態様または設計は、必ずしも、他の態様または設計より好ましいまたは有利とは解釈されない。
【００１３】
さらに、開示される主題は、本明細書で詳細に説明される諸態様を実施するためにコンピュータまたはプロセッサベースのデバイスを制御するためにソフトウェア、ファームウェア、ハードウェア、またはその任意の組合せを作るのに標準プログラミングおよび／またはエンジニアリング技法を使用することによってシステム、方法、装置、または製造品として実施することができる。本明細書で使用される用語「製造品」（またはその代わりに「コンピュータプログラム製品」）は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。例えば、コンピュータ可読媒体は、磁気ストレージデバイス（例えば、ハードディスク、フロッピー(登録商標）ディスク、磁気ストリップ．．．）、光ディスク（例えば、コンパクトディスク（ＣＤ）、デジタル多用途ディスク（ＤＶＤ）．．．）、スマートカード、およびフラッシュメモリデバイス（例えば、カード、スティック）を含むことができるが、これらに限定はされない。さらに、電子メールの送信および受信またはインターネットもしくはローカルエリアネットワーク（ＬＡＮ）などのネットワークへのアクセスに使用されるものなどの搬送波を使用して、コンピュータ可読電子データを搬送できることを了解されたい。もちろん、請求される主題の範囲または趣旨から逸脱せずに、この構成に対して多数の変更を行うことができることを、当業者は認めるであろう。
【００１４】
まず図１に移ると、ラムダ式（lambda expression）の実行に関する実行システム１００が示されている。システム１００は、レシーバコンポーネント１１０および評価コンポーネント１２０を含む。レシーバコンポーネント１１０は、ラムダ式を入手し、その式を評価コンポーネント１２０に送る。評価コンポーネント１２０は、式を入手し、特定の型の値を計算し、返す。
【００１５】
ラムダ式とは、とりわけ、値およびデータを簡潔に指定し、または取り込む機構である。１つの実例で、ラムダ式を使用して、匿名メソッドを指定し、または置換することができる。匿名メソッドは、例えば、デリゲートに関連するプログラムコードを「インラインで」表現し、または記述することを可能にする。例えば、Ｃ＃でＩＥｎｕｍｅｒａｂｌｅ＜ｃｕｓｔｏｍｅｒ＞ｃｓと表されるカスタマのコレクションにまたがって照会することが望まれると仮定する。３５歳より若いカスタマを返すクエリは、次のように指定することができる。
【００１６】
【表１】
2009505174.tif 000003
【００１７】
その代わりに、例えば次のように、匿名メソッドを指定して、そのような式の指定を単純にすることができる。
【００１８】
【表２】
2009505174.tif 000004
【００１９】
これは、少なくとも新しいクラスを指定する必要がないので、前の例より簡潔である。新しいクラスを指定するのではなく、ｄｅｌｅｇａｔｅキーワードによって識別される匿名メソッドは、引数としてインライン化される。しかし、匿名メソッドの指定は、それでも非常に冗漫である。したがって、ラムダ式を、匿名メソッドの代わりに使用することができる。前のサンプルに従って、ラムダ式を利用して、はるかに簡潔に、機能的に情報を指定することができる。具体的に言うと、このラムダ式は、次に対応するものとすることができる。
【００２０】
【表３】
2009505174.tif 000005
【００２１】
ここでは、パラメータ「ｃ」ならびに式「ｃ．ａｇｅ＜３５」が識別される。これは、少なくとも不必要な構文および明示的な型宣言（例えば、Ｃｕｓｔｏｍｅｒ）が除去されるので、前の表現よりはるかに冗漫でない。
【００２２】
ラムダ式は、垂直のバーに囲まれたパラメータリストおよびそれに続く式または式本体として指定することができる。例えば、ラムダ式を、次の擬似ＢＮＦ（バッカス−ナウア記法）で指定されるように構造化することができる。
【００２３】
【表１】
2009505174.tif 000006
【００２４】
ラムダ式は、一般形式｜パラメータ｜式を有することができる。しかし、追加の指定の形も企図されている。例えば、ラムダ式を、形式パラメータ＝＞式、（パラメータ）＝＞式、ならびにデリミタおよび／またはシンボルの他の組合せもしくは置換で宣言することができる。構文を、ラムダ式が空のパラメータリストを有する場合に異なるものとすることもできる。垂直のバーが、式からパラメータを区切り、空のパラメータリストがある場合に、結果のトークンは、隣接する２つのバー文字（例えば、‖または｜｜）になるはずである。これは、一部のプログラミング言語で条件「ＯＲ」を表すのに利用される隣接するバーに関して曖昧さを生じる可能性がある。したがって、隣接するバーとそれに続く等号文字（例えば、｜｜＝）などであるがこれに限定はされない代替の表現を使用することができる。しかし、隣接するバー文字をオーバーロードし、空のパラメータリストならびに条件「ＯＲ」を表すのに利用することができることを了解されたい。
【００２５】
形式「｜パラメータ｜式」のラムダ式は、形式「ｄｅｌｅｇａｔｅ（パラメータ）｛ｒｅｔｕｒｎ  式；｝」の匿名メソッドに対応することができる。したがって、ラムダ式は、より冗漫な匿名メソッドを置換することができる。それでも、ラムダ式と匿名メソッドとの間には相違がある。とりわけ、ラムダ式は、パラメータ型を省略し、推論する（下で詳細に説明する）ことを可能にするが、匿名メソッドは、パラメータ型を明示的に述べることを必要とする。さらに、匿名メソッドの本体は、ステートメントブロックとして記述されるが、ラムダ式の本体は、式またはステートメントブロックのいずれかとすることができる。
【００２６】
図１に戻ると、レシーバコンポーネント１１０は、上で説明したラムダ式またはその表現を受け取り、取り出し、または他の形で入手する。次に、そのラムダ式を評価コンポーネント１２０に送ることができる。評価コンポーネント１２０は、ラムダ式に関連する値を計算し、その値を返す。限定ではなく例として、システム１００を、プログラム実行システムに関連付けることができる。ラムダ式は、プログラムステートメントの一部とすることができ、あるいは、引数および返される値などの他のコンストラクトを、関連するステートメントの処理においてさらに利用することができる。さらに、レシーバコンポーネント１１０および評価コンポーネント１２０は、ネストされたおよび／または階層的なラムダ式の評価を可能にするために協力することができる。例えば、
【００２７】
【表２】
2009505174.tif 000007
【００２８】
このステートメントは、カスタマの名前および年齢が選択され（「Ｓｅｌｅｃｔ（｜ｃ｜ｎｅｗ｛ｎａｍｅ＝ｃ．ｎａｍｅ，ａｇｅ＝ｃ．ａｇｅ｝））、そのコレクションから、年齢が３５歳未満のカスタマ（ｃｓ）が識別される（ｃｓ．ｗｈｅｒｅ（｜ｃ｜ｃ．ａｇｅ＜３５））ことを表す。
【００２９】
図２に、ラムダ式のプログラミングシステムまたはプログラミング環境２００を示す。システム２００は、開発コンポーネント２１０、コンパイラコンポーネント２２０、および実行可能プログラム２３０を含む。開発コンポーネント２１０は、プログラマなどのユーザから入力を受け取る。この入力には、少なくとも１つのラムダ式を含む複数のプログラムステートメントまたはコンストラクトを含めることができる。例えば、あるステートメントに、引数としてのラムダ式または関数もしくは型に割り当てられるラムダ式を含めることができる。式は、式本体からパラメータを分離するのに隣接するバー（例えば、｜ｃ｜ｃ．ａｇｅ＜３５）または二重矢印（例えば、ｃ＝＞ｃ．ａｇｅ）を利用することを含むがこれに限定されない複数の形式のうちのいずれか１つで表すことができる。開発コンポーネント２１０は、コードエディタ（例えば、テキストまたはグラフィカル）、統合開発環境（ＩＤＥ）、または類似物に対応するものとすることができる。コンパイラコンポーネント２２０（下でさらに詳細に説明する）は、開発コンポーネント２１０からプログラムソースコードを受け取り、コンピュータ実行可能プログラム２３０を生成することができ、あるいはその代わりに、例えばジャストインタイム（ＪＩＴ）コンパイラによるなど、ランタイムにさらにコンパイルできるある中間フォーマット（例えば、ＩＬ（中間言語））を生成することができる。コンパイラコンポーネント２２０を、ＩＤＥの一部とすることもできる。
【００３０】
図３に、型変換システム３００を示す。ラムダ式は、特殊な変換ルールを有する値として分類することができる。ラムダ式は、型を有しないが、ｄｅｌｅｇａｔｅ型などの互換の型に（例えば、暗黙のうちに）変換することができる。システム３００は、互換性コンポーネント３１０および変換コンポーネント３２０を含む。両方のコンポーネントを、図２のコンパイラコンポーネント２２０などのコンパイラの中に配置することができる。互換性コンポーネント３１０は、例えばラムダ式およびｄｅｌｅｇａｔｅ型関数からなる、ラムダ式割当を受け取る。その後、互換性コンポーネントは、あるルールまたは条件３１２に関して割当型を分析して、その割当型がラムダ式と互換であるかどうかを判定することができる。条件３１２が満足されない場合には、割り当てられる型は互換ではなく、エラーまたは例外を互換性コンポーネント３１０によって生成することができる。そうではなく、条件３１２が満足され、型がラムダ式と互換である場合には、式を、変換コンポーネント３２０によってこの型に変換することができる。
【００３１】
限定ではなく例として、ｄｅｌｅｇａｔｅ型Ｄは、様々な条件３１２が満足される時に、ラムダ式Ｌと互換であるものとすることができる。例えば、Ｄを、非ｖｏｉｄ戻り型を有しなければならず、ｒｅｆパラメータまたはｏｕｔパラメータを有してはならないものとすることができる。それに加えてまたはその代わりに、ＤおよびＬを、同一の個数のパラメータを有しなければならないものとすることができ、Ｌが明示的に型付けされたパラメータリストを有する場合には、Ｄの各パラメータの型は、Ｌの対応するパラメータの型と同一でなければならない。それに加えてまたはその代わりに、Ｌのパラメータが、Ｄの対応するパラメータの型を与えられる時に、Ｌの式本体を、Ｄの戻り型に暗黙のうちに変換可能な有効な式とすることができる。例えば、型Ａの引数をとり、型Ｒの値を返す関数を表すジェネリックｄｅｌｅｇａｔｅ型Ｆｕｎｃｔｉｏｎ＜Ａ，Ｒ＞を仮定する。
【００３２】
【表３】
2009505174.tif 000008
【００３３】
さらに、次の割当を仮定する。
【００３４】
【表４】
2009505174.tif 000009
【００３５】
ラムダ式｜ｘ｜ｘ＋１を、変換コンポーネント３２０によってｄｅｌｅｇａｔｅ型Ｆｕｎｃ＜ｉｎｔ，ｉｎｔ＞に成功して変換することができる。というのは、ｘが型ｉｎｔを与えられるときに、ｘ＋１が、型ｉｎｔに暗黙のうちに変換可能な有効な式であるからである。この割当は、より冗漫な匿名メソッド
【００３６】
【表５】
2009505174.tif 000010
【００３７】
と同等である。ラムダ式が、ｘの型を推論することを許容するが、必要とはしないのに対して、匿名メソッドが、型を明示的に述べることを必要とすることに留意されたい。
【００３８】
図４に移ると、ラムダ式に関する推論を可能にする型推論システム４００が示されている。型推論システム４００は、コンパイラコンポーネント２２０（図２）などのコンパイラの一部とすることができる。型推論システム４００は、コンテキストコンポーネント４１０および推論コンポーネント４２０を含む。コンテキストコンポーネント４１０は、ラムダ式を受け取るか識別した時に、例えば特定のラムダ式がそこから入手されたプログラムから、そのラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報は、ステートメント、式、クラス、型、および類似物を含む、ラムダ式に関連する任意の情報とすることができる。このコンテキスト情報は、例えばデータパケットの伝送を介して、推論コンポーネント４２０によってコンテキストコンポーネント４１０から入手される。さらに、ラムダ式を推論コンポーネント４２０に供給して、それに関連する型の型推論を容易にすることができる。推論コンポーネント４２０は、その後、コンテキスト情報を使用して、ラムダ式パラメータ、式本体、および／または戻り型の型などの型を推論することができる。もちろん、型推論を、推論された型が他の要素の型を推論するのを助けるようにするために伝搬させることができる。したがって、推論コンポーネント４２０は、追加の推論を行うのに使用できる推論のセット４３０を生成し、維持することができる。
【００３９】
ラムダ式自体は、構造的型（ｓｔｒｕｃｔｕｒａｌ  ｔｙｐｅ）など、それに関連する型を有しないことを了解されたい。そうではなく、パラメータおよび式本体または戻り値が、関連する型を有する。構造的型の推論が、オブジェクト指向言語について非自明であることが認められている。次の例示的なラムダ式およびオブジェクトを定義するクラスを検討されたい。
【００４０】
【表６】
2009505174.tif 000011
【００４１】
このラムダ式とカスタマおよびワインというオブジェクトクラスとを単純に分析することによって、パラメータ（ｘ）および戻り式値（ｘ．ａｇｅ）の型を判定することは、できない。パラメータは、型ｃｕｓｔｏｍｅｒを有することができ、これは、ａｇｅについて型ｉｎｔｅｇｅｒを返す。その代わりに、このパラメータを、ａｇｅについて型ｓｔｒｉｎｇを返す型ｗｉｎｅを有するものとすることができる。
【００４２】
しかし、型をコンテキストから推論することができる。次の宣言を検討されたい。
【００４３】
【表７】
2009505174.tif 000012
【００４４】
ＡをとりＲを返すｄｅｌｅｇａｔｅ型が指定されている。次に、ラムダ式が、デリゲート関数に割り当てられる。そのような追加のコンテキスト情報から、型を推論することができる。関数へのラムダ式の割当に基づいて、推論コンポーネント４２０は、引数ＳがＣｕｓｔｏｍｅｒでなければならないと判定することができる。次に、推論コンポーネント４２０は、パラメータｘが型Ｃｕｓｔｏｍｅｒを有すると推論することができる。これから、ｘ．ａｇｅを、Ｃｕｓｔｏｍｅｒクラスまたはオブジェクト定義から型ｉｎｔｅｇｅｒを有すると判定することができる。その後、型推論を、例えば検証コンポーネント４２２を介して、戻り型を比較することによって検証することができる。ここで、デリゲート関数Ｆｕｎｃは、型Ｂｏｏｌｅａｎ（ｂｏｏｌ）を返し、ラムダ式は、ａｇｅが３５未満であるかどうかの判定を介して型Ｂｏｏｌｅａｎを返す。したがって、推論コンポーネントは、コンテキストに基づいてラムダ式に関連する型を成功して推論することができた。実際には、デリゲート関数へのラムダ式の割当が、コンテキストおよび型情報をラムダ式にプッシュダウンすることを可能にした。
【００４５】
ラムダ式を伴う型推論の明瞭さおよび理解を容易にするために、もう１つの例示的シナリオを説明する。Ｃ＃の次のクラス定義を検討されたい。
【００４６】
【表８】
2009505174.tif 000013
【００４７】
Ｓｙｓｔｅｍ．Ｑｕｅｒｙ名前空間が、例えばｕｓｉｎｇ節を用いてインポートされたと仮定すると、型ｓｔｒｉｎｇのＮａｍｅプロパティを有するクラスＣｕｓｔｏｍｅｒを与えられれば、Ｓｅｌｅｃｔメソッドを使用して、カスタマのリストから名前を選択することができる。例えば、
【００４８】
【表９】
2009505174.tif 000014
【００４９】
Ｓｅｌｅｃｔのエクステンションメソッド呼び出しを、この呼び出しを静的メソッド呼び出しに書き直すことによって処理することができる。
【００５０】
【表１０】
2009505174.tif 000015
【００５１】
型推論を利用して、引数の型を推論することができる。コンテキスト情報は、ｃｕｓｔｏｍｅｒｓ引数がｓｏｕｒｃｅパラメータに関連することを明らかにし、したがって、ＴがＣｕｓｔｏｍｅｒであると推論することができる。その後、ｃに型Ｃｕｓｔｏｍｅｒを与えることができ、式ｃ．Ｎａｍｅは、ｓｅｌｅｃｔｏｒパラメータの戻り型に関連し、Ｓがｓｔｒｉｎｇであると推論される。したがって、この呼び出しは、
【００５２】
【表１１】
2009505174.tif 000016
【００５３】
と同等であり、その結果は、型ＩＥｎｕｍｅｒａｂｌｅ＜ｓｔｒｉｎｇ＞を有する。
【００５４】
次の例では、ラムダ型推論が、どのようにして型情報がジェネリックメソッド呼び出しの引数の間で「流れる」ことを可能にするかを示す。次のメソッドとその呼び出しを仮定する。
【００５５】
【表１２】
2009505174.tif 000017
【００５６】
この呼び出しに関する型推論は、まず、ｖａｌｕｅパラメータに関連する引数「１：１５：３０」から進行する。したがって、Ｘは、この引数に基づいてｓｔｒｉｎｇであると推論することができる。次に、最初のラムダ式のパラメータｓに、推論された型ｓｔｒｉｎｇが与えられる。式ＴｉｍｅＳｐａｎ．Ｐａｒｓｅ（ｓ）は、ｆ１（Ｙ）の戻り型に関連し、したがって、Ｓｙｓｔｅｍ．ＴｉｍｅＳｐａｎであると推論することができる。最後に、第２のラムダ式のパラメータｔに、推論された型Ｓｙｓｔｅｍ．ＴｉｍｅＳｐａｎが与えられ、式ｔ．ＴｏｔａｌＳｅｃｏｎｄｓは、ｆ２の戻り型に関連し、Ｚを、Ｓｙｓｔｅｍ．ＴｉｍｅＳｐａｎクラス（図示せず）に基づいて型ｄｏｕｂｌｅを有すると推論することが可能になる。したがって、この呼び出しの結果は、型ｄｏｕｂｌｅを有する。
【００５７】
図５に移ると、ラムダ式の型チェックをサポートする型チェックシステム５００が示されている。図４のシステム４００に似て、システム５００は、コンパイラの一部を形成することができる。型チェックシステム５００は、コンテキストコンポーネント４１０、推論コンポーネント４２０、ならびに型チェックコンポーネント５１０を含む。コンテキストコンポーネント４１０は、例えばラムダ式を含むプログラムから、ラムダ式を入手するか識別し、ラムダ式に関連するコンテキスト情報を取り出す。そのようなコンテキスト情報は、ラムダ式に直接にまたは間接に関連する任意のステートメント、式、クラス、型、および類似物とすることができる。推論コンポーネント４２０は、コンテキスト情報ならびにチェックされるラムダ式を受け取る。推論コンポーネント４２０は、コンテキストコンポーネント４１０によって供給されるコンテキスト情報ならびに推論のセット４３０内の他の推論を利用して、例えばラムダ式パラメータ、式、その要素、および／または戻り型の型を推論することができる。型を、冗漫さを減らすためにラムダ式から省略することができるが、そのような型を明示的に宣言することもできる。そのようなシナリオでは、型チェックコンポーネント５１０は、期待される型または推論された型と明示的な型とを比較して、それらが一致するかどうかを判定することができる。より具体的には、型チェックコンポーネント５１０は、推論された型を推論コンポーネント４２０から受け取ることができる。さらに、明示的な型を、型チェックコンポーネント５１０に供給されるか推論された型と共に渡されるラムダ式から入手することができる。型チェックコンポーネント５１０は、その明示的な型と推論された型とを比較することができる。型が一致する場合には、アクションを行う必要はない。その代わりに、型が一致しない場合には、型コンポーネントは、この事実を示すエラーまたは例外を生成することができる。
【００５８】
図６に、オーバーロード解決システム６００を示す。システム６００には、コンテキストコンポーネント４１０、推論コンポーネント４２０、および選択コンポーネント６１０を含めることができる。例えば引数内のラムダ式が、ある種の情況でオーバーロード解決に影響する可能性がある。コンテキストコンポーネント４１０は、ラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報を、推論コンポーネント４２０に送ることができる。推論コンポーネント４２０は、コンテキスト情報ならびに１つまたは複数の過去の推論４３０（推論のセット）を利用して、例えばラムダ式に関連する型を推論することができる。次に、これらの推論された型を、選択コンポーネント６１０に渡すことができる。選択コンポーネント６１０は、この情報を使用して、メソッドまたはそのようなメソッドがオーバーロードされる場合にｄｅｌｅｇａｔｅ型を判定するか選択することができる。ラムダ型を、その後、例えば特定のｄｅｌｅｇａｔｅ型に変換することができる。
【００５９】
様々なプロシージャまたはプロトコルを選択コンポーネント６１０によって使用して、オーバーロードされるメソッドまたはｄｅｌｅｇａｔｅ型を選択することができる。例えば、ラムダ式Ｌを与えられれば、ｄｅｌｅｇａｔｅ型Ｄ１およびｄｅｌｅｇａｔｅ型Ｄ２が同一のパラメータリストを有し、Ｌの戻り型からＤ１の戻り型への暗黙の変換がＬの戻り型からＤ２の戻り型への暗黙の変換よりよい変換である場合に、Ｄ１へのＬの暗黙の変換は、Ｄ２へのＬの暗黙の変換よりよい変換である。これらの条件が真でない場合には、どちらの変換もよりよい変換ではない。もちろん、逆も真である。次の例を検討されたい。
【００６０】
【表１３】
2009505174.tif 000018
【００６１】
ＩｔｅｍＬｉｓｔ＜Ｔ＞クラスは、２つのＳｕｍメソッドを有する。各メソッドは、ｓｅｌｅｃｔｏｒ引数をとり、このｓｅｌｅｃｔｏｒ引数は、合計される値をリストアイテムから抽出する。抽出された値は、ｉｎｔｅｇｅｒまたはｄｏｕｂｌｅのいずれかとすることができ、結果の合計は、同様にｉｎｔｅｇｅｒまたはｄｏｕｂｌｅのいずれかである。Ｓｕｍメソッドを使用して、例えば次のように、注文の詳細行のリストから合計を計算することができる。
【００６２】
【表１４】
2009505174.tif 000019
【００６３】
ｏｒｄｅｒＤｅｔａｉｌｓ．Ｓｕｍの第１の呼び出しでは、両方のＳｕｍメソッドが適用可能である。というのは、ラムダ式｜ｄ｜ｄ．ＵｎｉｔＣｏｕｎｔが、Ｆｕｎｃｔｉｏｎ＜Ｄｅｔａｉｌ，ｉｎｔ＞とＦｕｎｃｔｉｏｎ＜Ｄｅｔａｉｌ，ｄｏｕｂｌｅ＞との両方と互換であるからである。しかし、選択コンポーネント６１０を介するオーバーロード解決は、第１のＳｕｍメソッドを選択する。というのは、Ｆｕｎｃｔｉｏｎ＜Ｄｅｔａｉｌ，ｉｎｔ＞への変換が、Ｆｕｎｃｔｉｏｎ＜Ｄｅｔａｉｌ，ｄｏｕｂｌｅ＞への変換よりよいからである。具体的に言うと、ＵｎｉｔＣｏｕｎｔは型ｉｎｔｅｇｅｒを有する。
【００６４】
ｏｒｄｅｒＤｅｔａｉｌｓ．Ｓｕｍの第２の呼び出しでは、第２のＳｕｍメソッドだけが適用可能である。というのは、ラムダ式｜ｄ｜ｄ．ＵｎｉｔＰｒｉｃｅ  ＊  ｄ．ＵｎｉｔＣｏｕｎｔが、型ｄｏｕｂｌｅの値を作るからである。したがって、選択コンポーネント６１０は、その呼び出しについては第２のＳｕｍメソッドを選択する。
【００６５】
前述のシステムは、複数のコンポーネントの間の相互作用に関して説明された。そのようなシステムおよびコンポーネントに、上で指定されたコンポーネントまたはサブコンポーネント、指定されたコンポーネントまたはサブコンポーネントのうちのいくつか、および／または追加のコンポーネントを含めることができることを了解されたい。例えば、あるシステムに、コンテキストコンポーネント４１０、推論コンポーネント４２０、型チェッカコンポーネント５１０、選択コンポーネント６１０、またはこれらの組合せを含めることができる。サブコンポーネントを、親コンポーネント内に含まれるのではなく、他のコンポーネントに通信的に結合されたコンポーネントとして実施することもできる。さらに、１つまたは複数のコンポーネントを、集約機能性を提供する単一のコンポーネントに組み合わせ、あるいは複数のサブコンポーネントに分割することができることに留意されたい。これらのコンポーネントは、本明細書で具体的には説明されないが当業者に既知の１つまたは複数の他のコンポーネントと相互作用することもできる。
【００６６】
さらに、了解されるとおり、上の開示されたシステムおよび下の方法の様々な部分は、人工知能ベース、知識ベース、またはルールベースのコンポーネント、サブコンポーネント、プロセス、手段、方法、または機構（例えば、サポートベクトルマシン、ニューラルネットワーク、エキスパートシステム、Ｂａｙｅｓｉａｎ  ｂｅｌｉｅｆ  ｎｅｔｗｏｒｋ、ファジイ論理、ｄａｔａ  ｆｕｓｉｏｎ  ｅｎｇｉｎｅ、クラシファイヤ．．．）を含むかこれらからなるものとすることができる。そのようなコンポーネントは、なかんずく、それによって実行されるある種の機構またはプロセスを自動化して、このシステムおよび方法の諸部分をより適応式であると同時に効率的かつインテリジェントにすることができる。例えば、推論コンポーネント４２０は、人工知能、機械学習、または類似する機構を利用して、型の推論を容易にすることができる。それに加えてまたはその代わりに、選択コンポーネント６１０が、そのようなインテリジェント機構を使用して、オーバーロード解決を容易にすることができる。
【００６７】
上で説明した例示的システムに鑑みて、開示される主題に従って実施できる方法は、図７〜１２の流れ図を参照してよりよく理解される。説明を単純にするために、これらの方法は、一連のブロックとして図示され、説明されるが、一部のブロックが、図示され本明細書で説明される順序と異なる順序でおよび／または他のブロックと同時に発生し得るので、請求される主題が、ブロックの順序によって限定されないことを理解し、了解されたい。さらに、図示されたブロックの一部が、下で説明する方法の実施に必要でない場合がある。
【００６８】
さらに、下および本明細書全体を通じて開示される方法が、そのような方法をコンピュータにトランスポートし、転送するのを容易にするために製造品に格納されることができることをさらに了解されたい。本明細書で使用される用語製造品は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。
【００６９】
図７に移ると、ラムダ式実行の方法７００が示されている。符号７１０で、ラムダ式を受け取り、取り出し、または識別する。ラムダ式は、０個以上のパラメータと、式または式本体とを含むことができる。パラメータは、複数の形で式から区切ることができる。例えば、ラムダ式パラメータを、２つの垂直バーもしくは括弧の中に含めることができ、あるいは、二重矢印または類似物を利用して式本体から分離することができる。例えば、ラムダ式は、「｜ｘ｜ｘ＋１」、「（ｘ，ｙ）ｘ＋１」、または「ｘ＝＞ｘ＋１」という形をとることができる。さらに、パラメータなしのラムダ式を、例えば条件ｏｒ「‖」と明瞭に区別するために「‖＝」を利用することによって、異なる形で指定することができる。７２０で、ラムダ式の値を計算し、または評価する。そのような値は、ｉｎｔｅｇｅｒ、Ｂｏｏｌｅａｎ、およびｓｔｒｉｎｇを含むがこれらに限定されない任意の型を有するものとすることができる。７３０で、計算された値を返す。例えば、ラムダ式が引数として指定される場合に、計算された値を、呼出し側のステートメントまたはメソッドに返すことができる。その代わりに、ラムダ式がデリゲートなどの関数に割り当てられる場合に、計算された値をその関数に返すことができる。
【００７０】
図８に、ラムダ式に関連するプログラミング方法８００の流れ図を示す。符号８１０で、ラムダ式を指定する。例えば、ラムダ式は、コードエディタおよび／または統合開発環境を用いて、手動で、自動的に、または半自動的に指定することができる。ラムダ式には、上で説明したように０個以上のパラメータならびに式または式本体を含めることができる。ラムダ式は、式からパラメータを区切るのに１つまたは複数のシンボルを利用する任意の複数の形で指定することができる。例えば、ラムダ式を「｜ｃ｜ｃ．ａｇｅ」、「ｃ＝＞ｃ．ａｇｅ」、または「（ｃ）ｃ．ａｇｅ」と表すことができる。さらに、ラムダ式を、とりわけ、コンピュータ実行可能プログラム内で引数としてまたは関数に割り当てられるものとして指定することができる。符号８２０で、ラムダ式を含むプログラムをコンパイルのためにコンパイラに供給する。ソースコードから、コンパイラは、機械実行可能コードまたは例えばジャストインタイム（ＪＩＴ）コンパイラによってランタイムにさらにコンパイルできるある中間コードを作ることができる。８３０で、コンパイラによって生成されたコードを、コンピュータによって実行する。
【００７１】
図９に、ラムダ式変換の方法９００を示す。匿名メソッド表現に似て、ラムダ式は、特殊な変換ルールを伴う値として分類することができる。値は、型を有しないが、ｄｅｌｅｇａｔｅ型などの他の互換の型に変換することができる。符号９１０で、ラムダ式を受け取り、取り出し、または他の形で入手しあるいは識別する。受け取られたラムダ式は、この例では、特定の型に割り当てられる。例えば、
【００７２】
【表１５】
2009505174.tif 000020
【００７３】
ここで、このラムダ式は、ｄｅｌｅｇａｔｅ型関数に割り当てられる。９２０で、ラムダ式が、それが割り当てられる型と互換またはその型に変換可能であるかどうかに関する判定を行う。割り当てられる型に基づいて、検証される必要がある複数の条件が存在し得る。例えば、あるｄｅｌｅｇａｔｅ型Ｄがラムダ式Ｌと互換であるかどうかを判定するためには、次の条件すなわち、（１）Ｄが、非ｖｏｉｄの戻り型を有し、ｒｅｆパラメータまたはｏｕｔパラメータを有しないこと、（２）ＤおよびＬが、同一個数のパラメータを有し、Ｌが明示的に型付けされたパラメータリストを有する場合には、Ｄの各パラメータの型が、Ｌの対応するパラメータの型と同一でなければならないこと、および（３）各パラメータＬが、Ｄの対応するパラメータの型を与えられるときには、Ｌの式本体が、Ｄの戻り型に暗黙のうちに変換可能な有効な式であることを検証することができる。互換性条件が、９２０で満足されない場合には、９３０で、ラムダ式を非互換の型に変換する試みを示すエラーまたは例外を生成する。条件が９２０で満足される場合には、変換が許可され、９４０で、ラムダ式を変換する。上の例では、ラムダ式は、ｄｅｌｅｇａｔｅ型Ｆｕｎｃ＜ｉｎｔ，ｉｎｔ＞に成功して変換される。というのは、ｘが、型ｉｎｔを与えられ、ｘ＋１が、型ｉｎｔに暗黙のうちに変換可能な有効な式であるからである。この割当は、匿名メソッドを使用する次のより冗漫な形式と同等である。
【００７４】
【表１６】
2009505174.tif 000021
【００７５】
図１０は、ラムダ式に関する型推論方法１０００である。符号１０１０で、プログラム内のラムダ式を識別する。１０２０で、ラムダ式に直接にまたは間接に関連するコンテキスト情報を入手する。そのようなコンテキスト情報に、とりわけ、クラス、オブジェクト、関数、メソッド、および型を含めることができる。例えば、ラムダ式が関数に割り当てられる場合には、その関数がコンテキスト情報を提供する。ラムダ式がメソッド引数である場合には、そのメソッドがコンテキスト情報を提供する。符号１０３０で、ラムダ式に関連する型を推論する。例えば、ラムダ式パラメータを、得られたコンテキスト情報に基づいて推論することができる。ラムダ式本体要素および／または戻り型は、以前の推論およびコンテキスト情報に基づいて判定することができる。例えば、ジェネリックメソッドに引数として渡されるラムダ式を検討されたい。型推論を、まず、各引数と独立に行うことができる。この初期フェーズでは、ラムダ式である引数からは何も推論されない。しかし、初期フェーズの後に、追加の推論を、反復プロセスを使用してラムダ式から行うことができる。具体的に言うと、メソッドの戻り型と共に、初期フェーズからのコンテキスト情報を利用して、型推論を容易にすることができる。そのようなプロセスは、さらなる推論を行えなくなるまで繰り返すことができる。
【００７６】
図１１に、ラムダ式が型推論プロセスにどのように加わることができるかをさらに了解するために、例示的な型推論方法１１００を示す。方法１１００は、メソッド引数としてのラムダ式の使用に関する。方法１１００を変更して、ラムダ式割当およびラムダ式の他の使用を扱うこともできることを了解されたい。符号１１１０で、メソッドおよび必要な場合に非ラムダ式引数について型を推論する。１１２０で、ラムダ式をメソッド引数として識別する。その後、１１３０で、パラメータ型および式要素型などのラムダ式型を推論する。この推論は、例えば関連するメソッド、呼出し側メソッド、および／またはそのメソッドの他の引数に関連するものを含む、推論の現在のセットに基づくものとすることができる。１１４０で、チェックを行って、メソッドパラメータ戻り型が、ラムダ式の戻り型と同一であるかどうかを判定する。そうでない場合には、誤ったコード指定または推論があった可能性が高い。したがって、１１５０でエラーを生成することができ、この方法は終了する。戻り型が同一である場合には、この方法は、１１６０に進行することができ、１１６０では、それからの推論がまだ行われていないラムダ式がまだあるかどうかに関する判定を行う。まだある場合には、それらのラムダ式を１１２０で識別し、この方法は、そこから進行する。ラムダ式がもうない場合には、この方法は終了する。
【００７７】
例として、次のコードスニッペット内の次のＳｅｌｅｃｔエクステンションメソッドを検討されたい。
【００７８】
【表１７】
2009505174.tif 000022
【００７９】
このＳｅｌｅｃｔメソッドを使用して、次のコードを介してカスタマのリストを選択することができる。
【００８０】
【表１８】
2009505174.tif 000023
【００８１】
Ｓｅｌｅｃｔのこのエクステンションメソッド呼び出しは、この呼び出しを次などの静的メソッド呼び出しに書き直す（例えば、コンパイラによって）ことによって処理することができる。
【００８２】
【表１９】
2009505174.tif 000024
【００８３】
上のコードスニッペットの型引数は、明示的に指定されていないので、これらを推論することができる。非ラムダ式引数「ｃｕｓｔｏｍｅｒｓ」があるので、この型をまず推論することができる。ここで、「ｃｕｓｔｏｍｅｒｓ」は、ｓｏｕｒｃｅパラメータに関連し、型Ｔを有する。この特定の呼び出しから、Ｔを、型Ｃｕｓｔｏｍｅｒを有すると推論することができる。ラムダ式パラメータｃおよび式本体ｃ．Ｎａｍｅは、Ｓｅｌｅｃｔメソッドのｓｅｌｅｃｔｏｒパラメータに関連する。ラムダ式パラメータｃは、型Ｔに対応し、これは、既に型Ｃｕｓｔｏｍｅｒを有することが推論されており、したがって、ｃは型Ｃｕｓｔｏｍｅｒを有する。式本体ｃ．Ｎａｍｅは、パラメータＳに対応し、これは、型ｓｔｒｉｎｇを有すると推論することができる。Ｃｕｓｔｏｍｅｒ型から、クラスｃ．Ｎａｍｅがｓｔｒｉｎｇなどの特定の型を有することを見つけることができる。したがって、ラムダ式本体とメソッドパラメータ戻り型との両方が、型ｓｔｒｉｎｇを有する。したがって、型推論が、成功して完了している。この呼び出しは、次の明示的に型指定されたメソッド呼び出しと同等である。
【００８４】
【表２０】
2009505174.tif 000025
【００８５】
この例は、型情報をどのように判定できるか、および型情報が呼出し側メソッドならびにその非ラムダ式引数からラムダ式にどのように流れるかを示すものである。
【００８６】
図１２に移ると、オーバーロード解決の方法１２００を示す流れ図が示されている。より具体的には、方法１２００は、例えば、オーバーロードされるメソッドの解決にラムダ式をどのように用いることができるかを示す。符号１２１０で、ラムダ式を、例えばメソッド引数として識別する。１２２０で、例えば推論のセットに基づく推論によって、ラムダ式の戻り型を判定する。最後に、１２３０で、ラムダ式の戻り型に基づいて、特定のオーバーロードされるメソッドを選択する。例えば、次のように異なる結果を返す２つのＳｕｍ関数を含むクラスを検討されたい。
【００８７】
【表２１】
2009505174.tif 000026
【００８８】
ここでは、Ｓｕｍがオーバーロードされる。ここで、次のコードが指定されると仮定する。
【００８９】
【表２２】
2009505174.tif 000027
【００９０】
どのＳｕｍを呼び出すかを決定し、オーバーロードを解決するためには、ラムダ式の戻り型を判定しなければならない。ここで、ｐｓが、型Ｌｉｓｔ＜Ｐｒｏｄｕｃｔ＞を有することが示されている。これから、ｐが型Ｐｒｏｄｕｃｔを有すると推論することができる。次に、Ｐｒｏｄｕｃｔのクラス定義に基づいて、ｐ．Ｐｒｉｃｅの型を判定することができる。この例について、この定義から、ｐ．Ｐｒｉｃｅが型ｄｏｕｂｌｅを有することが明らかになると仮定する。ここで、指定されたコードが、Ｐｒｏｄｕｃｔをとり、ｄｏｕｂｌｅを返すことがわかる。したがって、このコードは、型Ｆｕｎｃ＜Ｐｒｏｄｕｃｔ，ｄｏｕｂｌｅ＞を有する。この知識から、第２のＳｕｍを選択することができる。Ｐｒｏｄｕｃｔクラス定義から、ｐ．Ｐｒｉｃｅが型ｉｎｔｅｇｅｒを有することが明らかにされる場合には、このコードは、型Ｆｕｎｃ＜Ｐｒｏｄｕｃｔ，ｉｎｔ＞を有する。このシナリオでは、型ｉｎｔｅｇｅｒはｄｏｕｂｌｅに変換可能であるが、第１のＳｕｍ関数がよりよい一致なので、第１のＳｕｍ関数が選択されるはずである。この例から了解されるとおり、ラムダ式戻り型に基づいて、正しいメソッドまたは関数を選択することができるので、関数のうちの一方をまず選択する必要はない（例えば、構造的型指定を用いて行われるように）。
【００９１】
図１３は、実装コード（例えば、実行可能ファイル、中間言語．．．）を作るのに利用できるコンパイラ環境１３００を示す概略ブロック図である。コンパイラ環境１３００は、コンパイラ２２０を含み、コンパイラ２２０は、フロントエンドコンポーネント１３２０、コンバータコンポーネント１３３０、バックエンドコンポーネント１３４０、エラーチェッカコンポーネント１３５０、シンボルテーブル１３６０、解析ツリー１３７０、および状態１３８０を含む。コンパイラ２２０は、入力としてソースコードを受け入れ、出力として実装コードを作る。入力には、本明細書で説明する区切られたプログラム式または修飾された識別子を含めることができるが、これらに限定はされない。このコンパイラ環境のコンポーネントおよびモジュールの間の関係は、データのメインフローを示す。他のコンポーネントおよび関係は、図を明瞭にし、単純にするために図示されていない。実施態様に応じて、コンポーネントを追加し、省略し、複数のモジュールに分割し、他のモジュールと組み合わせ、かつ／またはモジュールの他の構成とすることができる。
【００９２】
コンパイラ２２０は、要素のシーケンスの処理に関連するソースコードを有するファイルを入力として受け入れる。ソースコードには、ラムダ式ならびに関連する関数、メソッド、および／または他のプログラムコンストラクトを含めることができる。コンパイラ２２０は、コンストラクトを分析し、コードを生成するか注入するために、１つまたは複数のコンポーネントと共にソースコードを処理することができる。
【００９３】
フロントエンドコンポーネント１３２０は、ソースコードを読み取り、ソースコードに対する字句解析を実行する。本質的に、フロントエンドコンポーネント１３２０は、ソースコード内の文字（例えば英数字）のシーケンスを読み取り、これらを、とりわけ定数、識別子、演算子シンボル、キーワード、および句読点を示す構文要素またはトークンに変換する。
【００９４】
コンバータコンポーネント１３３０は、トークンを中間表現に解析する。例えば、コンバータコンポーネント１３３０は、構文をチェックし、トークンを式または他の構文構造にグループ化し、この式または他の構文構造は、ステートメントツリーに合体される。概念的に、これらのツリーは、解析ツリー１３７０を形成する。さらに、適当に、コンバータコンポーネント１３３０は、エントリをシンボルテーブル１３６０に置くことができ、このシンボルテーブルは、関連する特性と共に、ソースコード内で使用されるシンボル名および型情報をリストする。
【００９５】
状態１３８０を使用して、受け取られたまたは取り出されたソースコードの処理および解析ツリー１３７０の形成におけるコンパイラ２２０の進行を追跡することができる。例えば、異なる状態値は、コンパイラ２２０が、クラス定義または関数の始めに位置する、クラスメンバを宣言し終えたばかりである、あるいは１つの式を完了したことを示す。コンパイラが進行する時に、コンパイラは、状態１３８０を継続的に更新する。コンパイラ２２０は、状態１３８０を外部エンティティに部分的にまたは完全に公開することができ、この外部エンティティは、コンパイラ２２０に入力を供給することができる。
【００９６】
ソースコード内のコンストラクトまたは他のシグナルに基づいて（または、他の形で機会が認識される場合に）、コンバータコンポーネント１３３０または別のコンポーネントは、効率的で正しい実行を容易にするために、対応するコードを注入することができる。コンバータコンポーネント１３３０または他のコンポーネントにコーディングされたルールは、所望の機能性を実施するために行わなければならないことを示し、コードを注入すべき位置または他の動作を実行しなければならない位置を識別する。注入されるコードは、通常、１つまたは複数の位置に追加されるステートメント、メタデータ、または他の要素を含むが、このことばは、既存ソースコードの変更、削除、または他の形での修正をも含むことができる。注入されるコードは、１つまたは複数のテンプレートとして、またはある他の形で格納することができる。さらに、シンボルテーブル操作および解析ツリー変換を行うことができることを了解されたい。
【００９７】
シンボルテーブル１３６０および解析ツリー１３７０に基づいて、バックエンドコンポーネント１３４０は、中間表現を出力コードに変換することができる。バックエンドコンポーネント１３４０は、中間表現を、ターゲットプロセッサ内でまたはこれによって実行可能な命令、変数のメモリ割当などに変換する。出力コードは、実プロセッサによって実行可能とすることができるが、本発明は、仮想プロセッサによって実行可能な出力コードをも企図している。
【００９８】
さらに、フロントエンドコンポーネント１３２０およびバックエンドコンポーネント１３４０は、コード最適化など、追加の機能を実行することができ、説明される動作を単一のフェーズまたは複数のフェーズとして実行することができる。コンパイラ２２０のコンポーネントの様々な他の態様は、性質において普通であり、同等の機能を実行するコンポーネントに置換することができる。さらに、ソースコードの処理中の様々なステージで、エラーチェッカコンポーネント１３５０は、語彙構造のエラー、構文エラー、およびセマンティックエラーなどのエラーについてチェックすることができる。エラーの検出時に、チェッカコンポーネント１３５０は、コンパイルを停止し、エラーを示すメッセージを生成することができる。
【００９９】
開示される主題の様々な態様のコンテキストを提供するために、図１４および１５ならびに次の議論は、開示される主題の様々な態様を実施できる適切な環境の短い全般的な説明を提供することを意図されたものである。この主題を、１つのコンピュータおよび／または複数のコンピュータで動作するコンピュータプログラムのコンピュータ実行可能命令の全般的な文脈で上で説明したが、当業者は、本発明を他のプログラムモジュールと組み合わせて実施することもできることを認めるであろう。一般に、プログラムモジュールは、特定のタスクを実行し、かつ／または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造などを含む。さらに、当業者は、本発明の方法を、シングルプロセッサコンピュータシステムまたはマルチプロセッサコンピュータシステム、ミニコンピューティングデバイス、メインフレームコンピュータ、ならびにパーソナルコンピュータ、ハンドヘルドコンピューティングデバイス（例えば、携帯情報端末（ＰＤＡ）、電話機、腕時計．．．）、マイクロプロセッサベースのまたはプログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス、および類似物を含む、他のコンピュータシステム構成を用いて実践できることを了解するであろう。示された態様は、通信ネットワークを介してリンクされたリモート処理デバイスによってタスクが実行される分散コンピューティング環境でも実践することができる。しかし、本発明の態様の、すべてではないにせよ一部を、独立型コンピュータで実践することができる。分散コンピューティング環境では、プログラムモジュールを、ローカルとリモートとの両方のメモリストレージデバイスに置くことができる。
【０１００】
図１４を参照すると、本明細書で開示される様々な態様を実施する例示的環境１４１０に、コンピュータ１４１２（例えば、デスクトップ機、ラップトップ機、サーバ、ハンドヘルド機、プログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス．．．）が含まれる。コンピュータ１４１２は、処理ユニット１４１４、システムメモリ１４１６、およびシステムバス１４１８を含む。システムバス１４１８は、システムメモリ１４１６を含むがこれに限定されないシステムコンポーネントを処理ユニット１４１４に結合する。処理ユニット１４１４は、様々な使用可能なマイクロプロセッサのいずれかとすることができる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャも、処理ユニット１４１４として使用することができる。
【０１０１】
システムバス１４１８は、メモリバスもしくはメモリコントローラ、周辺バスもしくは外部バス、ならびに／または１１ビットバス、Ｉｎｄｕｓｔｒｉａｌ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＩＳＡ）、マイクロチャネルアーキテクチャ（ＭＣＡ）、Ｅｘｔｅｎｄｅｄ  ＩＳＡ（ＥＩＳＡ）、Ｉｎｔｅｌｌｉｇｅｎｔ  Ｄｒｉｖｅ  Ｅｌｅｃｔｒｏｎｉｃｓ（ＩＤＥ）、ＶＥＳＡ  Ｌｏｃａｌ  Ｂｕｓ（ＶＬＢ）、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）、Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ（ＵＳＢ）、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔ（ＡＧＰ）、Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ  Ｍｅｍｏｒｙ  Ｃａｒｄ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ａｓｓｏｃｉａｔｉｏｎバス（ＰＣＭＣＩＡ）、およびＳｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍｓ  Ｉｎｔｅｒｆａｃｅ（ＳＣＳＩ）を含むがこれに限定されない様々な使用可能なバスアーキテクチャのいずれかを使用するローカルバスを含む複数のタイプのバス構造のいずれかとすることができる。
【０１０２】
システムメモリ１４１６は、揮発性メモリ１４２０および不揮発性メモリ１４２２を含む。スタートアップ中などにコンピュータ１４１２内の要素の間で情報を転送する基本ルーチンを含む基本入出力システム（ＢＩＯＳ）が、不揮発性メモリ１４２２に格納される。限定ではなく例として、不揮発性メモリ１４２２は、読取専用メモリ（ＲＯＭ）、プログラマブルＲＯＭ（ＰＲＯＭ）、電気的プログラム可能ＲＯＭ（ＥＰＲＯＭ）、電気的消去可能ＲＯＭ（ＥＥＰＲＯＭ）、またはフラッシュメモリを含むことができる。揮発性メモリ１４２０は、外部キャッシュメモリとして働くランダムアクセスメモリ（ＲＡＭ）を含む。限定ではなく例として、ＲＡＭは、シンクロナスＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、シンクロナスＤＲＡＭ（ＳＤＲＡＭ）、ダブルデータレートＳＤＲＡＭ（ＤＤＲ  ＳＤＲＡＭ）、エンハンストＳＤＲＡＭ（ＥＳＤＲＡＭ）、Ｓｙｎｃｈｌｉｎｋ  ＤＲＡＭ（ＳＬＤＲＡＭ）、およびｄｉｒｅｃｔ  Ｒａｍｂｕｓ  ＲＡＭ（ＤＲＲＡＭ）などの多数の形で入手可能である。
【０１０３】
コンピュータ１４１２は、リムーバブル／ノンリムーバブルの揮発性／不揮発性コンピュータ記憶媒体をも含む。図１４に、例えば、ディスクストレージ１４２４を示す。ディスクストレージ１４２４は、磁気ディスクドライブ、フロッピー(登録商標）ディスクドライブ、テープドライブ、Ｊａｚドライブ、Ｚｉｐドライブ、ＬＳ−１００ドライブ、フラッシュメモリカード、またはメモリスティックなどのデバイスを含むが、これらに限定はされない。さらに、ディスクストレージ１４２４に、コンパクトディスクＲＯＭデバイス（ＣＤ−ＲＯＭ）、ＣＤ  ｒｅｃｏｒｄａｂｌｅドライブ（ＣＤ−Ｒドライブ）、ＣＤ  ｒｅｗｒｉｔａｂｌｅドライブ（ＣＤ−ＲＷドライブ）、またはデジタル多用途ディスクＲＯＭドライブ（ＤＶＤ−ＲＯＭ）などの光学ディスクドライブを含むがこれに限定されない記憶媒体を、他の記憶媒体と別々にまたはこれらと組み合わせて含めることができる。システムバス１４１８へのディスクストレージデバイス１４２４の接続を容易にするために、インターフェース１４２６などのリムーバブルまたはノンリムーバブルのインターフェースが、通常は使用される。
【０１０４】
図１４に、ユーザと、適切なオペレーティング環境１４１０で説明した基本的なコンピュータリソースとの間の媒介として働くソフトウェアが記載されていることを了解されたい。そのようなソフトウェアに、オペレーティングシステム１４２８が含まれる。オペレーティングシステム１４２８は、ディスクストレージ１４２４に格納することができるが、コンピュータシステム１４１２を制御し、そのリソースを割り当てるように働く。システムアプリケーション１４３０は、プログラムモジュール１４３２を介するオペレーティングシステム１４２８によるリソースの管理およびシステムメモリ１４１６内またはディスクストレージ１４２４上のいずれかに格納されたプログラムデータ１４３４を利用する。本発明を、様々なオペレーティングシステムまたはオペレーティングシステムの組合せを用いて実施できることを了解されたい。
【０１０５】
ユーザは、入力デバイス１４３６を介してコンピュータ１４１２にコマンドまたは情報を入力する。入力デバイス１４３６は、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロホン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ、スキャナ、ＴＶチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラ、および類似物を含むが、これらに限定はされない。これらおよび他の入力デバイスは、インターフェースポート１４３８を介し、システムバス１４１８を介して処理ユニット１４１４に接続される。インターフェースポート１４３８は、例えば、シリアルポート、パラレルポート、ゲームポート、およびｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ（ＵＳＢ）を含む。出力デバイス１４４０は、入力デバイス１４３６と同一タイプのポートのいくつかを使用する。したがって、例えば、ＵＳＢポートを使用して、コンピュータ１４１２に入力を提供し、コンピュータ１４１２から出力デバイス１４４０に情報を出力することができる。出力アダプタ１４４２が、ディスプレイ（例えば、フラットパネルおよびＣＲＴ）、スピーカ、およびプリンタなど、出力デバイス１４４０の中でも特殊なアダプタを必要とするいくつかの出力デバイス１４４０があることを示すために提供される。出力アダプタ１４４２には、限定ではなく例として、出力デバイス１４４０とシステムバス１４１８との間の接続の手段を提供する、ビデオカードおよびサウンドカードが含まれる。リモートコンピュータ１４４４など、他のデバイスおよび／またはデバイスのシステムが、入力機能と出力機能との両方を提供することに留意されたい。
【０１０６】
コンピュータ１４１２は、リモートコンピュータ１４４４などの１つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。リモートコンピュータ１４４４は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ワークステーション、マイクロプロセッサベースの機器、ピアデバイス、または他の一般的なネットワークノードおよび類似物とすることができ、リモートコンピュータ１４４４は、通常は、コンピュータ１４１２に関して説明した要素の多数またはすべてを含む。図を簡単にするために、メモリストレージデバイス１４４６だけが、リモートコンピュータ１４４４と共に図示されている。リモートコンピュータ１４４４は、論理的にネットワークインターフェース１４４８を介してコンピュータ１４１２に接続され、次に、物理的に通信接続１４５０を介して接続される。ネットワークインターフェース１４４８は、ローカルエリアネットワーク（ＬＡＮ）および広域ネットワーク（ＷＡＮ）などの通信ネットワークを含む。ＬＡＮテクノロジは、Ｆｉｂｅｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｄａｔａ  Ｉｎｔｅｒｆａｃｅ（ＦＤＤＩ）、Ｃｏｐｐｅｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｄａｔａ  Ｉｎｔｅｒｆａｃｅ（ＣＤＤＩ）、イーサネット（登録商標）／ＩＥＥＥ８０２．３、トークンリング／ＩＥＥＥ  ８０２．５、および類似物を含む。ＷＡＮテクノロジは、ポイントツーポイントリンク、サービス総合デジタル網（ＩＳＤＮ）およびその変形形態などの回路交換網、パケット交換網、およびデジタル加入者回線（ＤＳＬ）を含むが、これに限定はされない。
【０１０７】
通信接続１４５０は、ネットワークインターフェース１４４８をバス１４１８に接続するのに使用されるハードウェア／ソフトウェアを指す。通信接続１４５０は、図を明瞭にするためにコンピュータ１４１２の内部に図示されているが、コンピュータ１４１２の外部とすることもできる。ネットワークインターフェース１４４８への接続に必要なハードウェア／ソフトウェアは、例示のみとして、通常の電話等級モデム、ケーブルモデム、電力線モデム、およびＤＳＬモデムを含むモデム、ＩＳＤＮアダプタ、ならびにイーサネット（登録商標）カードまたはイーサネット（登録商標）コンポーネントなどの、内蔵テクノロジおよび外付けテクノロジを含む。
【０１０８】
図１５は、本発明が相互作用できるサンプルのコンピューティング環境１５００の概略ブロック図である。システム１５００は、１つまたは複数のクライアント１５１０を含む。クライアント１５１０は、ハードウェアおよび／またはソフトウェア（例えば、スレッド、プロセス、コンピューティングデバイス）とすることができる。システム１５００は、１つまたは複数のサーバ１５３０をも含む。したがって、システム１５００は、他のモデルの中でも、２ティアクライアントサーバモデルまたはマルチティアモデル（例えば、クライアント、ミドルティアサーバ、データサーバ）に対応することができる。サーバ１５３０も、ハードウェアおよび／またはソフトウェア（例えば、スレッド、プロセス、コンピューティングデバイス）とすることができる。サーバ１５３０は、例えば、本発明を使用することによって、変換を実行するスレッドを収容することができる。クライアント１５１０とサーバ１５３０との間の可能な通信の１つを、複数のコンピュータプロセスの間で伝送されるように適合されたデータパケットの形とすることができる。システム１５００は、クライアント１５１０とサーバ１５３０との間の通信を容易にするのに使用することができる通信フレームワーク１５５０を含む。クライアント１５１０は、クライアント１５１０にローカルな情報を格納するのに使用できる１つまたは複数のクライアントデータストア１５６０に動作可能に接続される。同様に、サーバ１５３０は、サーバ１５３０にローカルな情報を格納するのに使用することができる１つまたは複数のサーバデータストア１５４０に動作可能に接続される。
【０１０９】
上で説明したものは、請求される主題の諸態様の例を含む。もちろん、請求される主題の説明においてコンポーネントまたは方法のすべての考えられる組合せを説明することは不可能であるが、当業者は、開示された主題の多数のさらなる組合せおよび置換が可能であることを認めるであろう。したがって、開示された主題は、添付の特許請求の範囲の趣旨および範囲に含まれるすべてのそのような代替形態、修正形態、および変形形態を含むことが意図されている。さらに、用語「含む（ｉｎｃｌｕｄｅｓ）」、「有する（ｈａｓ）」、または「有する（ｈａｖｉｎｇ）」が詳細な説明または特許請求の範囲のいずれかで使用される範囲で、これらの用語は、用語「含む（ｃｏｍｐｒｉｓｉｎｇ）」が特許請求の範囲で前後を接続する単語として使用される時に「含む（ｃｏｍｐｒｉｓｉｎｇ）」が解釈される形に類似する形で包含的であることを意図されている。
【図面の簡単な説明】
【０１１０】
【図１】ラムダ式の実行システムを示すブロック図である。
【図２】ラムダ式をサポートするプログラミングシステムを示すブロック図である。
【図３】型変換システムを示すブロック図である。
【図４】ラムダ式に関連する型を推論する型推論システムを示すブロック図である。
【図５】ラムダ式を型チェックする型チェックシステムを示すブロック図である。
【図６】オーバーロード解決システムを示すブロック図である。
【図７】ラムダ式実行方法を示す流れ図である。
【図８】プログラミング方法を示す流れ図である。
【図９】ラムダ式変換方法を示す流れ図である。
【図１０】ラムダ式に関連する型推論方法を示す流れ図である。
【図１１】例示的な型推論方法を示す流れ図である。
【図１２】オーバーロード解決方法を示す流れ図である。
【図１３】コンパイル環境を示す概略ブロック図である。
【図１４】適切なオペレーティング環境を示す概略ブロック図である。
【図１５】サンプルのコンピューティング環境を示す概略ブロック図である。
【図１】
2009505174.tif 000028
【図２】
2009505174.tif 000029
【図３】
2009505174.tif 000030
【図４】
2009505174.tif 000031
【図５】
2009505174.tif 000032
【図６】
2009505174.tif 000033
【図７】
2009505174.tif 000034
【図８】
2009505174.tif 000035
【図９】
2009505174.tif 000036
【図１０】
2009505174.tif 000037
【図１１】
2009505174.tif 000038
【図１２】
2009505174.tif 000039
【図１３】
2009505174.tif 000040
【図１４】
2009505174.tif 000041
【図１５】
2009505174.tif 000042
【国際調査報告】
2009505174.tif 000043