タグ付けされた質問 「type-inference」

型推論は、型システムによって定義されたルールを使用して、プログラムの型を自動的に推論するプロセスです。

30
C#でのvarキーワードの使用
ロックされています。質問はトピックから外れていますが、歴史的に重要であるため、この質問とその回答はロックされています。現在、新しい回答や相互作用を受け入れていません。 C#3で 'var'キーワードの使用について同僚と話し合った後、varを介した型推論の適切な使用についての人々の意見はどうだったのでしょうか。 たとえば、私は疑わしい状況でvarを怠惰に使用しました。例:- foreach(var item in someList) { // ... } // Type of 'item' not clear. var something = someObject.SomeProperty; // Type of 'something' not clear. var something = someMethod(); // Type of 'something' not clear. varのより正当な用途は次のとおりです。 var l = new List<string>(); // Obvious what l will be. …
406 c#  type-inference  var 

3
Collections.emptyList()はList <Object>を返しますか?
ジェネリック型パラメーターを推論するためのJavaのルールをナビゲートするのに問題があります。オプションのリストパラメータがある次のクラスを考えてみます。 import java.util.Collections; import java.util.List; public class Person { private String name; private List&lt;String&gt; nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List&lt;String&gt; nicknames) { this.name = name; this.nicknames = nicknames; } } 私のJavaコンパイラーは次のエラーを出します: Person.java:9: The constructor Person(String, List&lt;Object&gt;) is undefined しかし、ではなくCollections.emptyList()タイプを返します。キャストを追加しても役に立たない&lt;T&gt; List&lt;T&gt;List&lt;Object&gt; public Person(String name) { this(name,(List&lt;String&gt;)Collections.emptyList()); } …


14
C ++ 11のautoキーワードでは多すぎますか?
私はauto、C ++ 11標準で利用できる新しいキーワードを、それが設計されたと考えている複雑なテンプレート型に対して使用しています。しかし、私はそれを次のものにも使用しています: auto foo = std::make_shared&lt;Foo&gt;(); そしてもっと懐疑的に: auto foo = bla(); // where bla() return a shared_ptr&lt;Foo&gt; 私はこのトピックについてあまり議論していません。と思われるautoタイプは、多くの場合、文書化と健全性チェックの形であることから、過剰に使用することができます。使用の際にどこに線を引くautoか、この新機能の推奨される使用例は何ですか? 明確にするために、私は哲学的な意見を求めているのではありません。標準的な委員会によるこのキーワードの意図された使用をお願いします。おそらく、その意図された使用が実際にどのように実現されるかについてのコメントが必要です。 補足:この質問は、SE.Programmersに移動され、Stack Overflowに戻されました。これに関する議論は、このメタ質問にあります。

22
Swiftのコンパイル時間が非常に遅いのはなぜですか?
Xcode 6 Beta 6を使用しています。 これはしばらくの間私を悩ませてきたものですが、それは現在ほとんど使用することができない状態に達しています。 私のプロジェクトは、65個のSwiftファイルといくつかのブリッジされたObjective-Cファイル(まさしく問題の原因ではありません)の適切なサイズになり始めています。 Swiftファイルを少し変更すると(アプリでほとんど使用されないクラスに単純な空白を追加するなど)、指定したターゲットのSwiftファイル全体が再コンパイルされます。 より詳細な調査の結果、コンパイラ時間のほぼ100%を占めているのは、CompileSwiftXcodeがswiftcターゲットのすべてのSwiftファイルに対してコマンドを実行するフェーズであることがわかりました。 さらに調査を行ったところ、アプリデリゲートをデフォルトのコントローラーでのみ維持した場合、コンパイルは非常に高速でしたが、プロジェクトファイルを追加していくと、コンパイル時間が非常に遅くなり始めていました。 現在、ソースファイルは65個しかないため、毎回コンパイルするのに約8/10秒かかります。それほど迅速ではありません。 私は除いて、この問題について話して任意のポスト見ていないこれを、私はその場合には一つだけだ場合、私は思ったんだけどだから、Xcodeの6の古いバージョンでした。 更新 Alitfire、Euler、CryptoSwiftのようなGitHub上のいくつかのSwiftプロジェクトを確認しましたが、実際に比較するのに十分なSwiftファイルがありませんでした。適切なサイズで開始していることがわかった唯一のプロジェクトはSwiftHNでした。ソースファイルが12個しかなかったとしても、同じことを確認できましたが、1つの単純なスペースとプロジェクト全体で再コンパイルが必要でした。少し時間(2/3秒)。 アナライザーとコンパイルの両方が非常に高速であるObjective-Cコードと比較すると、これはSwiftが大きなプロジェクトを処理することができないように感じますが、私が間違っていると言ってください。 Xcode 6 Beta 7での更新 まだ改善はありません。これはとんでもないことになり始めています。#importSwiftに欠けているので、Appleがこれをどのように最適化できるかは本当にわかりません。 Xcode 6.3およびSwift 1.2での更新 Appleはインクリメンタルビルド(および他の多くのコンパイラ最適化)を追加しました。これらの利点を確認するには、コードをSwift 1.2に移行する必要がありますが、AppleはXcode 6.3にそのためのツールを追加しました。 しかしながら 私のようにあまり早く喜んではいけません。ビルドをインクリメンタルにするために使用するグラフソルバーは、まだ十分に最適化されていません。 実際、最初に、関数のシグネチャの変更は確認されないため、1つのメソッドのブロックにスペースを追加すると、そのクラスに依存するすべてのファイルが再コンパイルされます。 第二に、変更がそれらに影響を与えない場合でも、再コンパイルされたファイルに基づいてツリーを作成するようです。たとえば、これらの3つのクラスを別のファイルに移動した場合 class FileA: NSObject { var foo:String? } class FileB: NSObject { var bar:FileA? } class FileC: NSObject { var baz:FileB? } …

5
クラス型を関数パラメーターとして渡す方法
Webサービスを呼び出し、JSON応答をシリアル化してオブジェクトに戻す汎用関数があります。 class func invokeService&lt;T&gt;(service: String, withParams params: Dictionary&lt;String, String&gt;, returningClass: AnyClass, completionHandler handler: ((T) -&gt; ())) { /* Construct the URL, call the service and parse the response */ } 私が達成しようとしているのは、このJavaコードに相当するものです public &lt;T&gt; T invokeService(final String serviceURLSuffix, final Map&lt;String, String&gt; params, final Class&lt;T&gt; classTypeToReturn) { } 私のメソッド署名は、私が達成しようとしているものの正しいですか? より具体的にはAnyClass、パラメーター型として指定することは正しいことですか? メソッドを呼び出すMyObject.selfと、returningClass値として渡していますが、「式のタイプ '()'をタイプ …

14
C ++でautoを使用して変数を宣言することの欠点はありますか?
これはauto、C ++ 11に追加されるかなり重要な機能であり、多くの新しい言語に従っているようです。Pythonのような言語と同様に、明示的な変数宣言はありません(Python標準を使用して可能かどうかはわかりません)。 auto変数を明示的に宣言する代わりにを使用して宣言することに欠点はありますか?

1
Scalaは推論された型の「許容できる複雑さ」にどのような制限を課しますか?
Scala言語仕様によると: ...ローカル型推論は、[型パラメーターの]推論された境界の複雑さを制限するために許可されています。タイプの最小性と最大性は、許容される複雑性のタイプのセットと比較して理解する必要があります。 実際には限界は何ですか? また、推定された式の型に適用される制限は、パラメーターの型の境界とは異なりますか?それらの制限は何ですか?

8
設計時にvarを使用して宣言された変数の型を確実に判断するにはどうすればよいですか?
私はemacsでC#の補完(インテリセンス)機能に取り組んでいます。 ユーザーがフラグメントを入力し、特定のキーストロークの組み合わせを介して補完を要求すると、補完機能は.NETリフレクションを使用して可能な補完を決定するという考え方です。 これを行うには、完成するものの種類を知っている必要があります。文字列の場合、考えられるメソッドとプロパティの既知のセットがあります。それがInt32の場合は、別個のセットがあります。 emacsで利用可能なコードレクサー/パーサーパッケージのセマンティックを使用して、変数宣言とその型を見つけることができます。そのため、リフレクションを使用して型のメソッドとプロパティを取得し、オプションのリストをユーザーに提示するのは簡単です。(OK、emacs 内で実行するのは簡単ではありませんが、 emacs 内でpowershellプロセスを実行する機能を使用すると、はるかに簡単になります。リフレクションを実行するためのカスタム.NETアセンブリを記述し、それをpowershellにロードしてから、elisp内で実行しますemacsはコマンドをpowershellに送信し、comintを介して応答を読み取ることができます。その結果、emacsはリフレクションの結果をすばやく取得できます。) 問題varは、完了したものの宣言でコードが使用するときに発生します。つまり、タイプが明示的に指定されておらず、補完が機能しません。 変数がvarキーワードで宣言されている場合、実際に使用されているタイプを確実に判断するにはどうすればよいですか?明確にするために、実行時にそれを決定する必要はありません。「設計時」に決定したい。 これまでのところ、私はこれらのアイデアを持っています: コンパイルして呼び出す: 宣言ステートメントを抽出します。例: `var foo =" a string value ";` ステートメント `foo.GetType();`を連結します 結果のC#フラグメントを動的にコンパイルして新しいアセンブリに アセンブリを新しいAppDomainに読み込み、フレームを実行して戻り値の型を取得します。 アセンブリをアンロードして破棄する 私はこれをすべて行う方法を知っています。しかし、エディターでの完了要求ごとに、それはひどく重いように聞こえます。 私は毎回新しいAppDomainを必要としないと思います。単一のAppDomainを複数の一時的なアセンブリに再利用し、複数の完了リクエストにまたがって、それを設定および破棄するコストを償却できます。これは、基本的な考え方の微調整です。 ILのコンパイルと検査 宣言をモジュールにコンパイルし、ILを検査して、コンパイラーによって推論された実際のタイプを判別します。これはどのようにして可能でしょうか?ILの検査には何を使用しますか? そこにもっと良いアイデアはありますか?コメント?提案? 編集 -これについてさらに考えると、コンパイルと呼び出しは受け入れられません。呼び出しには副作用がある可能性があるためです。したがって、最初のオプションは除外する必要があります。 また、.NET 4.0の存在は想定できません。 更新 -正解は、上記には言及されていませんが、エリックリッパートによって穏やかに指摘されていますが、完全な忠実度の型推論システムを実装することです。これは、設計時に変数のタイプを確実に決定する唯一の方法です。しかし、それも簡単ではありません。私はそのようなものを構築したいという幻想に苦しんでいないので、オプション2のショートカットをとりました-関連する宣言コードを抽出してコンパイルし、結果のILを検査します。 これは、完了シナリオのかなりのサブセットに対して実際に機能します。 たとえば、次のコードフラグメントで、?ユーザーが完了を要求する位置です。これは機能します: var x = "hello there"; x.? 補完により、xは文字列であることがわかり、適切なオプションが提供されます。これは、次のソースコードを生成してコンパイルすることによって行われます。 namespace N1 { static class dmriiann5he …

1
静的ジェネリックメソッドの呼び出し
静的なジェネリックメソッドに関する奇妙な状況に遭遇しました。これはコードです: class Foo&lt;E&gt; { public static &lt;E&gt; Foo&lt;E&gt; createFoo() { // ... } } class Bar&lt;E&gt; { private Foo&lt;E&gt; member; public Bar() { member = Foo.createFoo(); } } 式で型引数を指定する必要がないのはFoo.createFoo()なぜですか?これはある種の型推論ですか?それについて明示的にしたい場合、型引数をどのように指定できますか?

5
型推論の実装
ここでは、静的型付けと動的型付けについて興味深い議論がいくつかあります。コンパイル型チェック、ドキュメント化されたコードなどにより、私は一般に静的型付けを好みます。しかし、たとえばJavaのようにコードを整理すると、コードが乱雑になることに同意します。 だから私は自分の関数型言語を作り始めようとしています。型推論は実装したいことの1つです。私はそれが大きな主題であることを理解しています、そして私は以前に行われていない何かを作成しようとしているのではなく、基本的な推論だけをしています... これで私を助けるであろう何を読むべきかについてのポインタ?より理論的なカテゴリー理論/タイプ理論のテキストとは対照的に、より実用的/実用的なものが好ましい。データ構造/アルゴリズムを使用した実装に関するディスカッションテキストがある場合、それはすばらしいことです。

3
Java8の例外型推論の固有の機能
このサイトで別の答えのコードを書いているときに、私はこの特異性に出くわしました。 static void testSneaky() { final Exception e = new Exception(); sneakyThrow(e); //no problems here nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception } @SuppressWarnings("unchecked") static &lt;T extends Throwable&gt; void sneakyThrow(Throwable t) throws T { throw (T) t; } static &lt;T extends Throwable&gt; void nonSneakyThrow(T t) throws T { throw t; } まず、sneakyThrowコンパイラーにとって呼び出しがOKである理由がかなり混乱しています。Tチェックされていない例外タイプのどこにも言及がない場合、どのようなタイプが推測されましたか? …

4
ラムダの戻り値の型がコンパイル時にチェックされないのはなぜですか?
使用されたメソッド参照は戻り型を持っていIntegerます。ただし、String次の例では互換性がありません。 メソッドwith宣言を修正して、手動でキャストせずにメソッド参照型を安全にする方法は? import java.util.function.Function; public class MinimalExample { static public class Builder&lt;T&gt; { final Class&lt;T&gt; clazz; Builder(Class&lt;T&gt; clazz) { this.clazz = clazz; } static &lt;T&gt; Builder&lt;T&gt; of(Class&lt;T&gt; clazz) { return new Builder&lt;T&gt;(clazz); } &lt;R&gt; Builder&lt;T&gt; with(Function&lt;T, R&gt; getter, R returnValue) { return null; //TODO } } static public interface MyInterface …

6
Javaがスーパータイプを推測できないのはなぜですか?
Longが拡張することは誰もが知っていNumberます。では、なぜこれがコンパイルされないのでしょうか? またwith、プログラムを手動キャストなしでコンパイルできるようにメソッドを定義する方法は? import java.util.function.Function; public class Builder&lt;T&gt; { static public interface MyInterface { Number getNumber(); Long getLong(); } public &lt;F extends Function&lt;T, R&gt;, R&gt; Builder&lt;T&gt; with(F getter, R returnValue) { return null;//TODO } public static void main(String[] args) { // works: new Builder&lt;MyInterface&gt;().with(MyInterface::getLong, 4L); // works: new Builder&lt;MyInterface&gt;().with(MyInterface::getNumber, (Number) 4L); …

2
`std :: mem :: drop`が上位のトレイト境界のクロージャ| _ |()とまったく同じではないのはなぜですか?
の実装はstd::mem::drop次のように文書化されています。 pub fn drop&lt;T&gt;(_x: T) { } そのため、クロージャー|_| ()(通称、トイレクロージャー)dropは、双方向での1対1の交換の可能性があると予想します。ただし、以下のコードdropは、これが関数のパラメーターにバインドされたより高いランクの特性と互換性がないことを示していますが、トイレのクロージャーは互換性があります。 fn foo&lt;F, T&gt;(f: F, x: T) where for&lt;'a&gt; F: FnOnce(&amp;'a T), { dbg!(f(&amp;x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } コンパイラのエラーメッセージ: error[E0631]: type mismatch in function arguments --&gt; src/main.rs:10:5 | …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.