プログラミング言語が戻り値の型に関係なくメソッドシグネチャを生成するのはなぜですか?


11

戻り値の型に基づいてメソッドシグネチャを生成しない多くの言語で作業しました。私はまた、それと一緒に働いたことがあります。過去に私に問題を与えていないもの(ここのような)。プログラミング言語が戻り値の型に関係なくメソッドシグネチャを生成するのはなぜですか?

更新:コンパイル済みの静的に型指定された言語を具体的に参照しています


これは非常に根拠のない推測ですが、コンパイラの実装やツールサポートの難しさと関係があると思います。
チャールズランバート

Haskellでは、タイプクラスを使用して、基本的に戻り値に依存する関数を作成できます。I <3 Haskell:D:D:D
トーマス・エディング

回答:


5

型キャストや型階層とうまく噛み合わないでしょう。メソッドの2つのバージョンがあり、1つはタイプAを返し、もう1つはタイプBを返す場合、次の場合に問題が発生します。

  • AまたはBは相互のサブタイプであり、スーパータイプであるものに戻り値を割り当てます。
  • AとBには共通のスーパータイプがあり、そのようなスーパータイプの値に割り当てます。

これをキャストで回避することもできますが、そのためには、いずれかの関数の名前を変更するのと同じくらいの入力が必要になります。呼び出しがあいまいな場合にコンパイラエラーを登録することもできます。その場合、ユーザーは同様の労力を費やす必要があります。


1
署名に戻り値の型を含む言語を使用しました。あなたが示すように、あちこちにキャストすることは問題ではありません。具体的な例では、キャストでこれを回避する必要はありません。AとB(Cのサブタイプ)の両方に同じ操作がある場合、Cで宣言する必要があります。戻り型がAとBで異なる場合:ほとんどの場合、Cのサブタイプを返そうとしています。サブタイプを返す別のメソッドをサブタイプに追加し、Cからバージョンを実装して、特定のサブタイプを持つメソッドを呼び出します。今、あなたはあちこちにキャストする必要はありません。
チャールズランバート

@Charles Lambert:クラスA、B、またはCに対する操作ではありません。同じ名前とパラメーターリストを持つ2つの関数で、1つはタイプAの何かを返し、もう1つはタイプBの何かを返します。この質問が適用されますOOPシステムだけでなく、一般的なタイプと機能に基づいて回答しました。また、私はあなたの反論の例が何を達成するつもりなのか理解していません。それに対応するには、より詳細な情報が必要です。
jprete

例ではコメントが短すぎます。pastebin.com/JR39PKs0基本的に、署名に戻り値の型を含む言語は、説明している問題を軽減する方法をすでに考え出しています。コーディング規約であれ、単なる標準プラクティスであれ。また、あなたが書いたものの多くは、戻り値の型のみが異なるメソッドの作成を保証するものではありません。だから、もう一度、あなたは非常に多くの場合、これに対処することはないだろう
チャールズ・ランバート

特定の引数シグネチャに対して宣言できる「プライマリ」メソッドは1つだけですが、任意の数のセカンダリメソッドを宣言でき、コンパイラは最初に引数シグネチャを識別することによってオーバーロードを実行する必要があるというルールに問題はありますかプライマリメソッドが存在し、次に特定の順序でセカンダリメソッドをチェックして、そのようなメソッドが明確に一致するかどうかを確認します(またはプライマリメソッドが一致しなかったとしても使用できます)。
supercat

3

メソッドを呼び出してもその結果を割り当てられないからです。


3
すべての言語ではありません。
ヨルグWミットタグ

@Jorgどの言語が好きですか?
カイロン

1
f#は1つの言語です。あなたは、一般的にFOOを参照してください-無視が無効に類似しているユニットの戻り値の型を持つメソッドです>無視
チャールズ・ランバート

Adaはより良い例です。その言語は、実際には署名の一部として戻り値の型も使用します。
チャールズランバート

-4

経験則:強く型付けされた言語は通常、メソッドシグネチャを戻り値の型にバインドします。弱い型付け言語はそうではありません。
私はC#を知りませんが、C#がジェネリックを処理する方法に問題があるのではないかと思います。一般的なメソッドとはまったく異なるメソッドを作成している可能性があります。その場合、実際には2つの異なるメソッドです。


1
これらの強く型付けされた言語のどれに言及していますか?私は何も知りませんし、C ++が戻り値の型の解決を明示的に禁止していることも知っています。
greyfade

2
-1違反している1つの例で、表面上は間違っている経験則を与える場合は、ルールが遵守されている他のすべての例でそれに従う必要があります。

@greyfade、私のポイントは、弱い型付けの言語では、コンパイル時に割り当てがチェックされないということでした。同意しますが、ここでは関係ないかもしれません。
CMR

「厳密に型指定された言語は通常、...戻り値型にバインドする」という不正確な主張によって、あなたの主張があいまいになります。
-greyfade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.