คำถามติดแท็ก type-inference

การอนุมานประเภทเป็นกระบวนการของการอนุมานประเภทสำหรับโปรแกรมโดยอัตโนมัติโดยใช้กฎที่กำหนดโดยระบบประเภท

30
การใช้คำหลัก var ใน C #
ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ หลังจากสนทนากับเพื่อนร่วมงานเกี่ยวกับการใช้คำหลัก 'var' ใน C # 3 ฉันสงสัยว่าความคิดเห็นของผู้คนเกี่ยวกับการใช้การอนุมานประเภทที่เหมาะสมผ่านทาง 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 …
406 c#  type-inference  var 

3
Collections.emptyList () ส่งคืนรายการ <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;การเพิ่มนักแสดงไม่ได้ช่วยอะไร …

18
ตรวจสอบว่าวัตถุเป็นประเภทที่กำหนดใน Swift
AnyObjectฉันมีอาร์เรย์ที่ถูกสร้างขึ้นจาก ฉันต้องการวนซ้ำและหาองค์ประกอบทั้งหมดที่เป็นอินสแตนซ์ของอาร์เรย์ ฉันจะตรวจสอบว่าวัตถุเป็นประเภทที่กำหนดใน Swift ได้อย่างไร

14
คำหลักอัตโนมัติ C ++ 11 มีมากเกินไป
ฉันใช้autoคำหลักใหม่ที่มีอยู่ในมาตรฐาน C ++ 11 สำหรับประเภท templated ที่ซับซ้อนซึ่งเป็นสิ่งที่ฉันเชื่อว่าได้รับการออกแบบมา แต่ฉันก็ใช้มันเพื่อสิ่งต่าง ๆ เช่น: 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 ไฟล์อย่างรวดเร็วและไม่กี่สะพานไฟล์ Objective-C (ซึ่งจริงๆไม่ได้เป็นสาเหตุของปัญหา) ดูเหมือนว่าการดัดแปลงเล็กน้อยสำหรับไฟล์ Swift ใด ๆ (เช่นการเพิ่มพื้นที่สีขาวแบบง่าย ๆ ในคลาสที่แทบจะไม่เคยใช้ในแอพ) จะทำให้ไฟล์ Swift ทั้งหมดสำหรับเป้าหมายที่ระบุได้รับการคอมไพล์ใหม่ หลังจากการตรวจสอบที่ลึกกว่านี้ฉันพบว่าสิ่งที่ใช้เวลาในการรวบรวม 100% นั้นเป็นCompileSwiftขั้นตอนที่ Xcode ใช้swiftcคำสั่งในไฟล์ Swift ทั้งหมดของเป้าหมายของคุณ ฉันทำการตรวจสอบเพิ่มเติมและถ้าฉันเก็บตัวแทนแอพไว้ด้วยคอนโทรลเลอร์เริ่มต้นเท่านั้นการคอมไพล์นั้นเร็วมาก แต่เมื่อฉันเพิ่มไฟล์โครงการของฉันมากขึ้นเรื่อย ๆ เวลาในการคอมไพล์ก็เริ่มช้าลงจริง ๆ ขณะนี้มีไฟล์ต้นฉบับเพียง 65 ไฟล์จึงใช้เวลารวบรวมประมาณ 8/10 วินาทีในแต่ละครั้ง ไม่เร็วมากเลย ฉันไม่ได้เห็นโพสต์พูดคุยเกี่ยวกับปัญหานี้ยกเว้นคนนี้แต่มันเป็นรุ่นเก่า Xcode 6. ดังนั้นฉันสงสัยว่าถ้าผมเป็นเพียงหนึ่งในกรณีที่ UPDATE ฉันได้ตรวจสอบโครงการ Swift สองสามรายการบนGitHubเช่นAlamofire , EulerและCryptoSwiftแต่ไม่มีโครงการใดที่มีไฟล์ …

5
วิธีการส่งชนิดคลาสเป็นพารามิเตอร์ฟังก์ชัน
ฉันมีฟังก์ชั่นทั่วไปที่เรียกใช้บริการเว็บและทำให้การตอบสนอง 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) { } …

14
มีข้อเสียในการประกาศตัวแปรที่มี auto ใน C ++ หรือไม่
ดูเหมือนว่าautoเป็นคุณสมบัติที่มีความสำคัญพอสมควรที่จะเพิ่มใน C ++ 11 ที่ดูเหมือนว่าจะเป็นไปตามภาษาที่ใหม่กว่ามากมาย เช่นเดียวกับภาษาอย่าง Python ฉันไม่เคยเห็นการประกาศตัวแปรที่ชัดเจน (ฉันไม่แน่ใจว่ามันเป็นไปได้โดยใช้มาตรฐาน Python หรือไม่) มีข้อเสียเปรียบในการใช้autoประกาศตัวแปรแทนที่จะประกาศอย่างชัดเจนหรือไม่?

1
สกาลามีข้อ จำกัด อะไรบ้างสำหรับ "ความซับซ้อนที่ยอมรับได้" ของประเภทที่อนุมาน
ตามข้อกำหนดภาษาสกาล่า : ... การอนุมานประเภทท้องถิ่นได้รับอนุญาตเพื่อจำกัดความซับซ้อนของขอบเขตที่อนุมาน [ของพารามิเตอร์ประเภท] ต้องเข้าใจ Minimality และ Maximality เมื่อเทียบกับชุดของประเภทของความซับซ้อนที่ยอมรับได้ ในทางปฏิบัติมีข้อ จำกัด อะไรบ้าง? นอกจากนี้ยังมีขีด จำกัด ที่แตกต่างกันที่ใช้กับประเภทนิพจน์ที่อนุมานมากกว่าขอบเขตประเภทพารามิเตอร์และขีด จำกัด เหล่านั้นคืออะไร

8
ฉันจะกำหนดประเภทของตัวแปรที่ประกาศโดยใช้ var ณ เวลาออกแบบได้อย่างน่าเชื่อถือได้อย่างไร
ฉันกำลังดำเนินการสิ่งอำนวยความสะดวก (Intellisense) สำหรับ C # ใน emacs แนวคิดคือถ้าผู้ใช้พิมพ์แฟรกเมนต์แล้วขอให้ดำเนินการเสร็จสิ้นโดยใช้การกดแป้นพิมพ์ร่วมกันสิ่งอำนวยความสะดวกในการทำให้เสร็จสมบูรณ์จะใช้การสะท้อน. NET เพื่อพิจารณาความสำเร็จที่เป็นไปได้ การทำเช่นนี้ต้องการให้ทราบประเภทของสิ่งที่จะเสร็จสมบูรณ์ หากเป็นสตริงจะมีชุดวิธีการและคุณสมบัติที่เป็นไปได้ ถ้าเป็น Int32 จะมีชุดแยกต่างหากและอื่น ๆ การใช้ความหมายแพคเกจรหัส lexer / parser ที่มีอยู่ใน emacs ฉันสามารถค้นหาการประกาศตัวแปรและประเภทของตัวแปรได้ ด้วยเหตุนี้จึงเป็นเรื่องง่ายที่จะใช้การสะท้อนเพื่อรับวิธีการและคุณสมบัติของประเภทจากนั้นจึงนำเสนอรายการตัวเลือกให้กับผู้ใช้ (โอเคไม่ตรงไปตรงมาที่จะทำภายใน emacs แต่การใช้ความสามารถในการเรียกใช้กระบวนการ powershell ภายใน emacsมันจะง่ายกว่ามากฉันเขียนแอสเซมบลี. NET ที่กำหนดเองเพื่อทำการสะท้อนโหลดลงใน powershell จากนั้น elisp ทำงานภายใน emacs สามารถส่งคำสั่งไปยัง powershell และอ่านการตอบกลับผ่าน comint ดังนั้น emacs จึงได้ผลลัพธ์ของการสะท้อนกลับอย่างรวดเร็ว) ปัญหามาถึงเมื่อรหัสใช้varในการประกาศสิ่งที่เสร็จสมบูรณ์ นั่นหมายความว่าไม่มีการระบุประเภทอย่างชัดเจนและการกรอกข้อมูลจะไม่ทำงาน ฉันจะกำหนดประเภทจริงที่ใช้อย่างน่าเชื่อถือได้อย่างไรเมื่อประกาศตัวแปรด้วยvarคีย์เวิร์ด เพื่อความชัดเจนฉันไม่จำเป็นต้องกำหนดตอนรันไทม์ ฉันต้องการตรวจสอบที่ "เวลาออกแบบ" …

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 ทำ ดังนั้นฉันกำลังจะเริ่มสร้างภาษาสไตล์การทำงานของตัวเองและการอนุมานประเภทเป็นหนึ่งในสิ่งที่ฉันต้องการนำไปใช้ ฉันเข้าใจว่ามันเป็นเรื่องใหญ่และฉันไม่ได้พยายามสร้างสิ่งที่ยังไม่เคยทำมาก่อนเพียงแค่การอนุมานขั้นพื้นฐาน ... มีคำแนะนำเกี่ยวกับสิ่งที่ต้องอ่านที่จะช่วยฉันในเรื่องนี้หรือไม่? โดยเฉพาะอย่างยิ่งสิ่งที่เป็นประโยชน์ / ปฏิบัติมากกว่าเมื่อเทียบกับทฤษฎีหมวดหมู่เชิงทฤษฎี / ตำราทฤษฎีประเภทอื่น ๆ หากมีข้อความอภิปรายเกี่ยวกับการนำไปใช้งานพร้อมโครงสร้างข้อมูล / อัลกอริทึมนั่นก็น่าจะดี

3
คุณลักษณะเฉพาะของการอนุมานประเภทข้อยกเว้นใน Java 8
ในขณะที่เขียนโค้ดสำหรับคำตอบอื่นบนไซต์นี้ฉันพบลักษณะเฉพาะนี้: 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โทรถึงคอมไพเลอร์จึงทำได้ …

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 …

6
ทำไมจาวาไม่สามารถอนุมานประเภทของ super?
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) …

2
เพราะเหตุใด `std :: mem :: drop` จึงเหมือนกับการปิด | _ | () ในขอบเขตที่สูงกว่า
การใช้งานของstd::mem::dropเอกสารจะเป็นดังต่อไปนี้: pub fn drop&lt;T&gt;(_x: T) { } ดังนั้นฉันจึงคาดหวังว่าการปิด|_| ()(หรือที่รู้จักกันในชื่อการปิดห้องน้ำ ) จะเป็น 1: 1 ที่มีศักยภาพในการทดแทนdropทั้งสองทิศทาง อย่างไรก็ตามรหัสด้านล่างแสดงให้เห็นว่า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 …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.