คำถามติดแท็ก higher-kinded-types

5
Scala ประเภทที่สูงกว่าคืออะไร
คุณสามารถค้นหาสิ่งต่อไปนี้บนเว็บ: ประเภทที่สูงขึ้นชนิด == ตัวสร้างประเภท? class AClass[T]{...} // For example, class List[T] บางคนบอกว่านี่เป็นประเภทที่สูงกว่าเพราะมันเป็นนามธรรมมากกว่าประเภทซึ่งจะสอดคล้องกับคำนิยาม ประเภทที่สูงขึ้นเป็นประเภทที่ใช้ประเภทอื่น ๆ และสร้างประเภทใหม่ แม้ว่าเหล่านี้เป็นที่รู้จักกันเป็นประเภทคอนสตรัค (ตัวอย่างเช่นในการเขียนโปรแกรมใน Scala ) typeed type ที่สูงขึ้น == type constructor ซึ่งใช้ตัวสร้าง type เป็นพารามิเตอร์ type? ในGenericsกระดาษชนิดที่สูงขึ้นคุณสามารถอ่าน ... ประเภทที่เป็นนามธรรมมากกว่าประเภทที่เป็นนามธรรมมากกว่าประเภท ('ประเภทที่สูงกว่าประเภท') ... " ซึ่งแสดงให้เห็นว่า class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]] เป็นประเภทที่สูงขึ้น ดังนั้นด้วยนี้ในใจมันเป็นเรื่องยากที่จะแยกแยะระหว่างประเภทคอนสตรัค , ประเภท …

5
ประเภทที่สูงกว่ามีประโยชน์เมื่อใด
ฉันทำ dev ใน F # มาระยะหนึ่งแล้วและฉันก็ชอบมัน อย่างไรก็ตามคำศัพท์หนึ่งที่ฉันรู้ว่าไม่มีอยู่ใน F # เป็นประเภทที่สูงกว่า ฉันได้อ่านเนื้อหาเกี่ยวกับประเภทที่สูงกว่าและฉันคิดว่าฉันเข้าใจคำจำกัดความของพวกเขา ฉันไม่แน่ใจว่าเหตุใดจึงมีประโยชน์ ใครช่วยยกตัวอย่างว่าประเภทที่สูงกว่าทำให้ง่ายใน Scala หรือ Haskell ที่ต้องใช้วิธีแก้ปัญหาใน F # สำหรับตัวอย่างเหล่านี้วิธีแก้ปัญหาจะเป็นอย่างไรหากไม่มีประเภทสูงกว่า (หรือในทางกลับกันใน F #) บางทีฉันอาจจะชินกับการทำงานกับมันมากจนฉันไม่สังเกตเห็นว่าไม่มีฟีเจอร์นั้น (ฉันคิดว่า) ฉันเข้าใจว่าแทนที่จะเป็นประเภทที่ดีกว่าmyList |> List.map fหรือmyList |> Seq.map f |> Seq.toListสูงกว่าช่วยให้คุณเขียนได้ง่ายๆmyList |> map fและมันจะส่งกลับ a List. มันเยี่ยมมาก (สมมติว่าถูกต้อง) แต่ดูเหมือนจะไม่สุภาพ? (และไม่สามารถทำได้ง่ายๆโดยปล่อยให้ฟังก์ชันโอเวอร์โหลด) ฉันมักจะแปลงเป็นSeqอย่างไรก็ตามจากนั้นฉันสามารถแปลงเป็นอะไรก็ได้ที่ฉันต้องการในภายหลัง อีกครั้งบางทีฉันก็ชินเกินไปที่จะทำงานกับมัน แต่จะมีตัวอย่างที่ใดประเภทสูง kinded จริงๆช่วยให้คุณประหยัดทั้งในการกดแป้นพิมพ์หรือในรูปแบบความปลอดภัย?

2
เพราะเหตุใด `std :: mem :: drop` จึงเหมือนกับการปิด | _ | () ในขอบเขตที่สูงกว่า
การใช้งานของstd::mem::dropเอกสารจะเป็นดังต่อไปนี้: pub fn drop<T>(_x: T) { } ดังนั้นฉันจึงคาดหวังว่าการปิด|_| ()(หรือที่รู้จักกันในชื่อการปิดห้องน้ำ ) จะเป็น 1: 1 ที่มีศักยภาพในการทดแทนdropทั้งสองทิศทาง อย่างไรก็ตามรหัสด้านล่างแสดงให้เห็นว่าdropไม่เข้ากันกับลักษณะการจัดอันดับที่สูงกว่าที่ถูกผูกไว้กับพารามิเตอร์ของฟังก์ชั่นในขณะที่การปิดห้องน้ำเป็น fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&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.