นี่คือสถานการณ์: ผมเคยเขียนโค้ดบางประเภทที่มีลายเซ็นและ GHC บ่นไม่สามารถอนุมาน x ~ Y สำหรับบางคนและx
y
โดยทั่วไปคุณสามารถขว้าง GHC กระดูกและเพิ่ม isomorphism ให้กับข้อ จำกัด ของฟังก์ชันได้ แต่นี่เป็นความคิดที่ไม่ดีด้วยเหตุผลหลายประการ:
- ไม่เน้นการเข้าใจรหัส
- คุณสามารถจบลงด้วยข้อ จำกัด 5 ข้อที่ใครจะพอเพียง (ตัวอย่างเช่นหากข้อ 5 ถูกระบุโดยข้อ จำกัด เฉพาะอีกข้อหนึ่ง)
- คุณสามารถจบลงด้วยข้อ จำกัด ปลอมหากคุณทำอะไรผิดพลาดหรือหาก GHC ไม่ช่วยเหลือ
ฉันใช้เวลาหลายชั่วโมงในการต่อสู้คดี 3. ฉันเล่นด้วยsyntactic-2.0
และผมพยายามที่จะกำหนดรุ่นโดเมนที่เป็นอิสระของคล้ายกับรุ่นที่กำหนดไว้ในshare
NanoFeldspar.hs
ฉันมีสิ่งนี้:
{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic
-- Based on NanoFeldspar.hs
data Let a where
Let :: Let (a :-> (a -> b) :-> Full b)
share :: (Let :<: sup,
Domain a ~ sup,
Domain b ~ sup,
SyntacticN (a -> (a -> b) -> b) fi)
=> a -> (a -> b) -> a
share = sugarSym Let
และ GHC could not deduce (Internal a) ~ (Internal b)
ซึ่งไม่ใช่สิ่งที่ฉันต้องการ ดังนั้นฉันจึงได้เขียนรหัสบางอย่างที่ฉันไม่ได้ตั้งใจ (ซึ่งจำเป็นต้องมีข้อ จำกัด ) หรือ GHC ต้องการข้อ จำกัด นั้นเนื่องจากข้อ จำกัด อื่น ๆ ที่ฉันได้เขียนไว้
ปรากฎว่าฉันต้องการเพิ่ม(Syntactic a, Syntactic b, Syntactic (a->b))
ในรายการข้อ จำกัด ซึ่งไม่มีนัย(Internal a) ~ (Internal b)
ใด ฉันสะดุดกับข้อ จำกัด ที่ถูกต้อง ฉันยังไม่มีวิธีค้นหาอย่างเป็นระบบ
คำถามของฉันคือ:
- ทำไม GHC จึงเสนอข้อ จำกัด ดังกล่าว ไม่มีข้อ จำกัด ทางด้าน syntax
Internal a ~ Internal b
ดังนั้น GHC จึงดึงสิ่งนั้นมาจากไหน - โดยทั่วไปแล้วเทคนิคใดที่สามารถใช้ในการติดตามต้นกำเนิดของข้อ จำกัด ที่ GHC เชื่อว่าจำเป็น แม้สำหรับข้อ จำกัด ที่ฉันสามารถค้นพบตัวเองวิธีการของฉันเป็นหลักบังคับให้เส้นทางที่กระทำผิดโดยการเขียนข้อ จำกัด แบบเรียกซ้ำ วิธีการนี้โดยทั่วไปจะลงไปในโพรงกระต่ายที่ไม่มีที่สิ้นสุดและเป็นวิธีที่มีประสิทธิภาพน้อยที่สุดที่ฉันสามารถจินตนาการได้
a
และb
จะผูกพัน - ดูที่ประเภทลายเซ็นนอกบริบทของคุณ - ไม่a -> (a -> b) -> a
a -> (a -> b) -> b
อาจจะใช่มั้ย ด้วยตัวแก้ไขข้อ จำกัด พวกเขาสามารถมีอิทธิพลต่อความเสมอภาคของสกรรมกริยาได้ทุกที่แต่ข้อผิดพลาดมักจะแสดงตำแหน่ง "ใกล้" กับตำแหน่งที่เกิดข้อ จำกัด นั่นจะเจ๋งมากแม้ว่า @jozefg - อาจมีข้อ จำกัด ในการใส่แท็กหรืออะไรสักอย่างเพื่อแสดงว่ามาจากไหน? : s