เหตุใด F # Core จึงกำหนดประเภทอาร์เรย์ทั่วไป


11

ฉันเพิ่งสังเกตเห็นว่าเนมสเปซ FSharp.Core มีประเภทอาเรย์ทั่วไปที่มีขนาดสูงสุด 4 มิติคือCore [] <'T> , Core. [,] <' T> ฯลฯ C # และ VB ดูเหมือนจะทำได้ดี ด้วย System.Array - แม้ว่ามันจะไม่ชัดเจนสำหรับฉันว่าพวกเขาจัดการเพื่อสนับสนุนประเภทอาเรย์พิเศษที่พิมพ์อย่างรุนแรงเช่น int [], string []

ฉันเดาว่านี่เป็นคำถามสองข้อแล้ว:

  • C # สนับสนุนประเภทอาเรย์พิเศษที่พิมพ์อย่างรุนแรงเช่น int [] โดยใช้ System.Array ที่ไม่ใช่แบบทั่วไปอย่างไร
  • เนื่องจาก C # จัดการเพื่อทำสิ่งนี้เหตุใด F # จึงกำหนดประเภทอาร์เรย์ทั่วไป

คำตอบ:


8

F # ไม่ได้กำหนดประเภทอาร์เรย์ทั่วไปต่อ se อาเรย์ใน F # เป็นอาเรย์ประเภทเดียวกับที่เหลือของ. NET ที่ใช้และแม้จะมีหลักฐานทางไวยากรณ์ทั้งหมดที่ชี้ไปในทางตรงกันข้าม

บางครั้งสิ่งนี้อาจย้อนกลับมาหาคุณเมื่อคุณใช้การสะท้อนใน F # - แม้ว่าคุณจะมีประเภทarray<int>ที่ดูเหมือนจะเป็นประเภททั่วไปที่ถูกต้องสมบูรณ์เมื่อคุณตรวจสอบว่าคุณได้รับเท็จจากIsGenericTypeจริงและจากIsArrayคุณได้รับการโต้แย้งประเภท มีมากกว่านั้นGetElementTypeGetGenericArguments

เช่นเดียวกับ Telastyn ที่ระบุไว้ในคำตอบของเขานี่น่าจะเป็นสัมภาระโบราณของ. NET 1.0 ที่เราจะต้องอยู่ด้วย แต่มันก็เป็นเพียงหนึ่งในหลาย ๆ สิ่งที่ทำให้การใช้ reflection API ใน F # เป็นทุ่นระเบิดที่แท้จริง

สิ่งที่ F # กำหนดคือ[], [,] ...ตัวย่อประเภท / นามแฝง / โอเปอเรเตอร์และโมดูลที่มีฟังก์ชั่นที่สอดคล้องกัน

คุณสามารถดูซอร์สโค้ดบน GitHub ที่นี่และที่นี่เพื่อดูด้วยตัวคุณเอง


แต่สิ่งเหล่านี้ถูกระบุว่าเป็นประเภทจริงไม่ใช่นามแฝงประเภท ฉันสับสนเพราะmsdn.microsoft.com/en-us/library/dd233214.aspxกล่าวว่า "ประเภทของ F # ทุกอาร์เรย์คือ. NET Framework Array ประเภท" แต่แล้วความสัมพันธ์ระหว่าง System.Array และ FSharp คืออะไร . Core ทั่วไปอาร์เรย์?
Asik

ไม่มีอาร์เรย์ทั่วไป;) พวกมันอาจเป็นประเภทจริงในทางเทคนิคและนั่นเป็นสาเหตุที่ msdn doc generator เลือกมัน แต่สิ่งที่พวกเขานิยามคือคอมไพเลอร์ควรจะขยายมันอย่างไรถ้าฉันอ่านมันอย่างถูกต้อง (ไฟล์แรกที่ฉันเชื่อมโยง) และวิธีการขยายคู่ในไฟล์ที่สอง นั่นคือทั้งหมดที่มีให้มัน สร้างหนึ่งในนั้นและโทร GetType กับมัน มันจะเป็นประเภทอาเรย์พิเศษที่ยึดตาม System.Array
scrwtp

หรือค่อนข้างคงที่ประเภทตัวเองเป็นประเภททั่วไป แต่ประเภทอาร์เรย์แบบรันไทม์ที่พวกเขากำลังห่อหุ้มไม่ได้ บางทีการใช้การอนุมานแบบนั้นอาจจะง่ายกว่านี้เล็กน้อย แต่นั่นเป็นสิ่งที่เดายาก
scrwtp

5

C # สนับสนุนประเภทอาเรย์พิเศษที่พิมพ์อย่างรุนแรงเช่น int [] โดยใช้ System.Array ที่ไม่ใช่แบบทั่วไปอย่างไร

เป็นไปได้มากโดยการสร้างคลาสเฉพาะที่สืบทอดมาSystem.Arrayตั้งแต่ชื่อ generics ไม่มีให้ใน 1.0 พฤติกรรมน่าจะถูกเก็บไว้รอบ ๆ เพื่อความเข้ากันได้

เนื่องจาก C # จัดการเพื่อทำสิ่งนี้เหตุใด F # จึงกำหนดประเภทอาร์เรย์ทั่วไป

เนื่องจาก F # ไม่มีข้อ จำกัด ด้านความสอดคล้องเช่นเดียวกับที่ C # 2.0 มีกับรหัสที่มีอยู่ จากสิ่งที่ฉันรู้ C # 2.0 จะมีประเภทอาเรย์ทั่วไปถ้าเป็นรุ่นแรกของ C #

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