# Haskell บน Maguyva: กราฟโค้ดสำหรับไทป์คลาสและโมดูล

Canonical source: https://maguyva.ai/th/languages/haskell

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva รองรับ Haskell ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามฟังก์ชัน อินสแตนซ์ของไทป์คลาส และคอนสตรักเตอร์ข้อมูลข้ามโมดูลได้

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .hs, .lhs
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- เซอร์วิสและไลบรารี Haskell ที่มีโมดูล ไทป์คลาส และอินสแตนซ์จำนวนมาก
- คอมไพเลอร์ พาร์เซอร์ และโค้ดเบสอื่นที่การเปลี่ยนไทป์ข้อมูลเพียงตัวเดียวส่งผลไปไกล
- ทีมที่อ่านโค้ด Haskell ที่ไม่คุ้นเคยร่วมกับเอเจนต์ AI ก่อนรีแฟกเตอร์

## เวิร์กโฟลว์ของเอเจนต์

- ค้นหาผู้เรียกทั้งหมดของฟังก์ชันก่อนเปลี่ยนซิกเนเจอร์ไทป์
- แสดงรายการไทป์ที่มีอินสแตนซ์ของไทป์คลาส
- ติดตามว่าคอนสตรักเตอร์ข้อมูลถูกสร้างที่ไหนและฟังก์ชันใดใช้มัน

## จุดที่ Haskell ทำให้เครื่องมือ AI แบบผิวเผินสะดุด

Haskell เรียกฟังก์ชันโดยไม่ใช้วงเล็บ ประกอบฟังก์ชันด้วยตัวดำเนินการ และส่งต่อการทำงานผ่านไทป์คลาส `render user` คือการเรียก `f . g <$> xs` มีการเรียกหลายครั้ง และ `show` มีความหมายตามที่อินสแตนซ์ของไทป์นั้นกำหนด การค้นหาข้อความเจอชื่อ แต่ไม่เจออินสแตนซ์เบื้องหลัง

Maguyva บันทึกอินสแตนซ์และคอนสตรักเตอร์เป็นความสัมพันธ์ เพื่อให้เอเจนต์เห็นว่าไทป์ใดอิมพลีเมนต์คลาส และค่าถูกสร้างขึ้นที่ไหน

## Maguyva ดึงอะไรจาก Haskell ได้บ้าง

Maguyva จับคู่ไฟล์ `.hs` และ `.lhs` เข้ากับภาษา Haskell โดยฟังก์ชันและการผูกค่าถูกดึงออกมาเป็นสิ่งที่เรียกใช้ได้ ส่วนไทป์คลาส ไทป์ `data` และไทป์ `newtype` ถูกดึงออกมาเป็นไทป์ การเรียกถูกจดจำได้ทั้งในการประยุกต์ใช้ที่คั่นด้วยช่องว่างและผ่านตัวดำเนินการแบบอินฟิกซ์ และการอิมพอร์ตปรับอนุประโยค `qualified`, `hiding` และ `as` ให้เป็นมาตรฐาน

ไทป์คลาสและคอนสตรักเตอร์กลายเป็นความสัมพันธ์ในกราฟ

- `instance Eq Point` บันทึกว่า `Point` อิมพลีเมนต์ `Eq`
- หากเมธอดของคลาสมีส่วนเนื้อหาเริ่มต้นในไฟล์เดียวกัน อินสแตนซ์ที่นิยามเมธอดนั้นจะบันทึกการแทนที่ค่าเริ่มต้น
- การใช้คอนสตรักเตอร์ข้อมูลอย่าง `Point 1 2` นับเป็นการสร้างอินสแตนซ์
- `error`, `undefined` และ `throw` บันทึกการโยน และตัวจัดการอย่าง `catch` บันทึกการจับ

เนื่องจากการประกาศอินสแตนซ์อาจนิยามชื่ออย่าง `show` หรือ `return` นิยามในไฟล์เดียวกันจึงไม่ถูกสันนิษฐานว่าเป็นเป้าหมายของการเรียกที่ไม่มีรีซีฟเวอร์ซึ่งใช้ชื่อนั้น

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "ใครเรียก `parseConfig` และเรียกจากโมดูลไหนบ้าง" (`find_symbol` จากนั้น `dependency_search` ทิศทางขาเข้า)
- "ไทป์ใดบ้างที่มีอินสแตนซ์ `ToJSON`" (`dependency_search`)
- "ติดตามว่าคำขอถูกแยกวิเคราะห์และตรวจสอบความถูกต้องอย่างไร" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- ชื่อจาก Prelude และไลบรารีพื้นฐาน ประมาณ 130 ชื่อ เช่น `map`, `foldr`, `fmap`, `pure` และ `>>=` รวมถึงโมดูลอย่าง `Data.List` และ `Control.Monad` ถูกกรองออกจากความสัมพันธ์ ใช้ `text_pattern_search` สำหรับสิ่งเหล่านี้
- ในไวยากรณ์ โหนดฟังก์ชันพื้นฐานยังใช้แทนไทป์ฟังก์ชันด้วย ดังนั้นพรีเซ็ต `functions` ใน `structural_search` จึงคืนเฉพาะแลมบ์ดา และพรีเซ็ต `methods` กับ `variables` ไม่เลือกอะไรเลย ใช้ `find_symbol` สำหรับฟังก์ชันแบบมีชื่อ
- ไฟล์ลิเทอเรต `.lhs` ถูกอ่านทั้งไฟล์ด้วยไวยากรณ์ของ Haskell อาจได้ผลลัพธ์ไม่ครบในไฟล์เหล่านี้
- Haskell ไม่มีไวยากรณ์เดคอเรเตอร์ ความสัมพันธ์ของเดคอเรเตอร์จึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) สำหรับโค้ดเบสเชิงฟังก์ชันอื่น ๆ ให้อ่าน[คู่มือภาษา Elixir](/th/languages/elixir)

## รายละเอียดเอนจิน

- การรองรับ Haskell จับคู่ไฟล์ `.hs` และ `.lhs` กับ Haskell ไทป์คลาส ไทป์ `data` และไทป์ `newtype` เป็นไทป์ การเรียกถูกจดจำได้ในการประยุกต์ใช้ที่คั่นด้วยช่องว่างและผ่านตัวดำเนินการแบบอินฟิกซ์
- `instance Eq Point` บันทึกว่า `Point` อิมพลีเมนต์ `Eq` และเมธอดของอินสแตนซ์ที่แทนค่าเริ่มต้นของคลาสในไฟล์เดียวกันจะบันทึกการแทนที่
- การใช้คอนสตรักเตอร์ข้อมูลนับเป็นการสร้างอินสแตนซ์ ชื่อจาก Prelude และไลบรารีพื้นฐาน ประมาณ 130 ชื่อถูกกรองออกจากความสัมพันธ์

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับฟังก์ชันหรือไทป์เมื่อต้องการนิยามและการอ้างอิง พรีเซ็ตเชิงโครงสร้างคืนเฉพาะแลมบ์ดา
- `dependency_search`: ใช้การท่องกราฟขาเข้าบนไทป์คลาสเพื่อดูว่าไทป์ใดมีอินสแตนซ์
- `get_task_context`: ใช้กับพรอมต์อย่าง "ติดตามว่าคำขอถูกแยกวิเคราะห์และตรวจสอบความถูกต้องอย่างไร"
