# Haskell trên Maguyva: đồ thị mã cho type class và module

Canonical source: https://maguyva.ai/vi/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 hỗ trợ Haskell với AST, ký hiệu và đồ thị, để agent AI có thể lần theo hàm, instance của type class và constructor dữ liệu qua các module.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .hs, .lhs
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## Phù hợp nhất

- Dịch vụ và thư viện Haskell có nhiều module, type class và instance.
- Trình biên dịch, bộ phân tích cú pháp và các codebase khác nơi thay đổi ở một kiểu dữ liệu lan ra xa.
- Các nhóm cùng agent AI đọc mã Haskell còn lạ trước khi tái cấu trúc.

## Workflow agent

- Tìm mọi nơi gọi một hàm trước khi đổi chữ ký kiểu của nó.
- Liệt kê các kiểu có instance cho một type class.
- Lần theo nơi một constructor dữ liệu được tạo ra và những hàm nào dùng nó.

## Haskell làm khó các công cụ AI hời hợt ở đâu

Haskell gọi hàm không cần dấu ngoặc, ghép chúng bằng toán tử và điều phối qua type class. `render user` là một lời gọi, `f . g <$> xs` chứa nhiều lời gọi, còn `show` mang nghĩa mà instance của kiểu đó quy định. Tìm kiếm văn bản thấy được tên, nhưng không thấy các instance phía sau.

Maguyva ghi lại instance và constructor thành quan hệ, để agent thấy kiểu nào triển khai một class và một giá trị được tạo ra ở đâu.

## Maguyva trích xuất gì từ Haskell

Maguyva ánh xạ các tệp `.hs` và `.lhs` sang Haskell. Hàm và binding được trích xuất thành callable, còn type class, kiểu `data` và kiểu `newtype` được trích xuất thành kiểu. Lời gọi được nhận diện trong phép áp dụng ngăn cách bằng khoảng trắng và qua toán tử trung tố, còn import chuẩn hóa các mệnh đề `qualified`, `hiding` và `as`.

Type class và constructor trở thành quan hệ trong đồ thị:

- `instance Eq Point` ghi lại rằng `Point` triển khai `Eq`.
- Nếu một phương thức của class có phần thân mặc định trong cùng tệp, instance định nghĩa phương thức đó sẽ ghi lại việc ghi đè giá trị mặc định.
- Áp dụng một constructor dữ liệu như `Point 1 2` được tính là khởi tạo.
- `error`, `undefined` và `throw` ghi lại lần ném, còn các trình xử lý như `catch` ghi lại lần bắt.

Vì khai báo instance có thể định nghĩa các tên như `show` hay `return`, một định nghĩa trong cùng tệp không được mặc định là đích của lời gọi không receiver mang tên đó.

## Ví dụ prompt cho agent

- "Ai gọi `parseConfig`, và từ những module nào?" (`find_symbol`, sau đó `dependency_search` theo chiều vào)
- "Những kiểu nào có instance `ToJSON`?" (`dependency_search`)
- "Lần theo cách một yêu cầu được phân tích và kiểm tra hợp lệ." (`get_task_context`)

## Giới hạn đã biết

- Khoảng 130 tên của Prelude và base như `map`, `foldr`, `fmap`, `pure` và `>>=`, cùng các module như `Data.List` và `Control.Monad`, bị lọc khỏi quan hệ. Dùng `text_pattern_search` cho chúng.
- Trong ngữ pháp, nút hàm thô còn biểu diễn kiểu hàm, nên preset `functions` trong `structural_search` chỉ trả về lambda, còn các preset `methods` và `variables` không chọn được gì. Dùng `find_symbol` cho hàm có tên.
- Tệp literate `.lhs` được đọc toàn bộ bằng ngữ pháp Haskell; hãy dự kiến kết quả không đầy đủ ở những tệp này.
- Haskell không có cú pháp decorator, nên các quan hệ decorator được đánh dấu là không áp dụng.

## Bước tiếp theo

Kết nối một kho mã bằng [hướng dẫn bắt đầu nhanh](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Với các codebase hàm khác, hãy đọc [hướng dẫn Elixir](/vi/languages/elixir).

## Chi tiết engine

- Hỗ trợ Haskell bao gồm các tệp `.hs` và `.lhs`. Type class, kiểu `data` và kiểu `newtype` là kiểu; lời gọi được nhận diện trong phép áp dụng cách bằng khoảng trắng và qua toán tử trung tố.
- `instance Eq Point` ghi lại rằng `Point` triển khai `Eq`, và một phương thức instance thay thế giá trị mặc định của class trong cùng tệp sẽ ghi lại việc ghi đè.
- Áp dụng một constructor dữ liệu được tính là khởi tạo; khoảng 130 tên của Prelude và base bị lọc khỏi quan hệ.

## Điểm khởi đầu MCP hữu ích

- `find_symbol`: Dùng cho hàm hoặc kiểu khi bạn cần định nghĩa và các tham chiếu; các preset cấu trúc chỉ trả về lambda.
- `dependency_search`: Dùng duyệt theo chiều vào trên một type class để thấy những kiểu nào có instance.
- `get_task_context`: Dùng cho prompt như "lần theo cách một yêu cầu được phân tích và kiểm tra hợp lệ".
