สมมติฐานใน“ Learn You a Haskell” เมื่ออนุมานประเภทใด


18

คำถามนี้ไม่ใช่เรื่องส่วนตัว ใช้คำกริยาที่เจาะจงมากในหนังสืออ้างอิงและฉันต้องการที่จะเข้าใจความหมายของถ้อยคำนั้นเพราะฉันกลัวว่าฉันเข้าใจผิดบางอย่าง

จากLearn You a Haskellย่อหน้าต่อไปนี้เป็นย่อหน้าที่สามและสุดท้ายที่มีคำว่า "เราถือว่า*"

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

Functorและตอนนี้เราต้องการที่จะทำให้มันเป็นตัวอย่างของ Functorต้องการประเภทของประเภท* -> *แต่Barryดูเหมือนว่าจะมีชนิดนั้น ชนิดของBarryอะไร something -> something -> something -> *ดีที่เราเห็นมันต้องใช้เวลาสามพารามิเตอร์ชนิดดังนั้นจึงเป็นไปได้ มันปลอดภัยที่จะบอกว่าเป็นชนิดที่เป็นรูปธรรมและทำให้มีชนิดของp สำหรับเราคิดและอื่น ๆ โดยขยายมีชนิดของ ตอนนี้ขอเพียงแค่เปลี่ยนชนิดผู้ที่มีของที่เรานำมาใช้เป็นตัวยึดและเราพบว่ามีชนิดของ*k*t* -> *something(* -> *) -> * -> * -> *

ทำไมเราถึงคิดอะไรอยู่เลย? เมื่ออ่าน "เราถือว่า X (เช่นเราถือว่า X เป็นจริง)" เป็นเรื่องปกติที่ฉันจะคิดว่าเราควรพิจารณากรณีที่ X เป็นเท็จ ในกรณีที่เฉพาะเจาะจงของตัวอย่างไม่tสามารถเป็นประเภท(* -> *) -> *และkชนิด(* -> *)? หากเป็นเช่นนี้อะไรtและที่kจริงแล้วt kจะยังคงเป็นรูปธรรมหรือไม่?

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


4
คุณถูก. อันที่จริงเราสามารถมีk :: Lชนิดใด ๆตราบใดที่L t :: L -> *คอมไพเลอร์ที่นี่จะต้องเลือกเฉพาะบางอย่างLหรือรีสอร์ทเพื่อ polykind polykind จะเป็นตัวเลือกที่ธรรมดาที่สุด แต่ที่นี่เลือก GHC L = *(Haskell พื้นฐานไม่มี polykinds พวกเขาต้องเปิดเป็นส่วนขยาย) เนื่องจากมันเลือกบางอย่างที่ค่อนข้างไม่มีกฎเกณฑ์ LYAH จึงใช้คำว่า "สมมติ" (AFAICT)
Chi

1
โอเคบางทีคอมไพเลอร์สันนิษฐานว่าน่าจะทำให้ฉันงงน้อยกว่าที่เราคิดเอาไว้หรืออย่างน้อยก็เลย
Enrico Maria De Angelis

คำตอบ:


19

ในความเป็นจริงคอมไพเลอร์จะถือว่า! แต่คุณสามารถขอไม่ใช้ส่วนขยาย PolyKinds ได้ คุณสามารถอ่านเกี่ยวกับเรื่องนี้ในรายละเอียดเพิ่มเติมที่นี่ เมื่อเปิดส่วนขยายBarryนั้นจะเป็นforall k. (k -> *) -> k -> * -> *เช่นนั้น


-1

จุดดี. ผู้เขียนทำให้สมมติฐานที่จำเป็น บางทีเพียงเพื่อให้ง่ายต่อการเข้าใจในบท Type Foo ของเขา แต่คนอย่างคุณอาจถามคำถามนี้อย่างถูกต้อง

ทั้งสอง t, kและpเป็นตัวแปรประเภท อย่างที่เราเห็นจากyabba :: pมันสามารถอยู่คนเดียวดังนั้นมันจึงเป็นฟังก์ชั่นคงที่ราวกับว่ามันเป็นค่าแทนที่จะเป็นประเภทมันเป็นลายเซ็นประเภทที่จะพูดIntหรือCharอะไรก็ตาม ... คุณชื่อมัน แต่เนื่องจากเป็นประเภทดังนั้นมันจึงเป็นลายเซ็นที่*ดี

แต่tพิมพ์ที่นี่จะใช้เวลาตัวแปรประเภทkที่จะสร้างประเภท ( dabba :: t k) ดังนั้นเราจึงมั่นใจว่า (assumtion ที่นี่ไม่มี) tมีลายเซ็นชนิดเช่น* -> *และk*มี

เมื่อเรารู้ว่านี้ ... ชนิดBarry t k p's ลายเซ็นเป็นชนิด(* -> *) -> * -> * -> *ซึ่งหมายความว่ามันจะใช้เวลาtนั้นkแล้วpและให้เราBarryชนิด

แก้ไขตรวจสอบให้แน่ใจว่าได้อ่านความคิดเห็น @ luqui ด้านล่าง


7
kไม่ได้ จำกัด ว่าจะเป็น*ตามที่คุณอ้างว่าเป็นในขณะที่ tdeducing เราสามารถมีk :: * -> *และt :: (* -> *) -> *ตัวอย่างเช่น เพิ่มเขตข้อมูลdoo :: k Intลงในระเบียนและมันจะผ่านไปโดยไม่มีปัญหา
luqui

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