# Maguyva의 Haskell 지원: 타입 클래스와 모듈을 위한 코드 그래프

Canonical source: https://maguyva.ai/ko/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는 AST, 심볼, 그래프로 Haskell을 지원하여, AI 에이전트가 모듈 전반에서 함수, 타입 클래스 인스턴스, 데이터 생성자를 따라갈 수 있게 합니다.

## 지원 현황 요약

- 등급: AST 및 심볼 지원
- 프로그래밍
- 확장자: .hs, .lhs
- 구문 인식 검색과 구조적 컨텍스트를 위한 실제 AST 파싱을 제공합니다.
- 이름이 지정된 심볼은 시맨틱 조회와 상호 참조에 활용됩니다. 관계 추출이 활성화된 경우 그래프 내비게이션을 사용할 수 있습니다.
- 이 언어는 그래프 인식 검색에 심볼과 관계를 제공합니다. 지원되는 에지 유형은 언어 고유의 구문 구조에 따라 다릅니다.
- AST 파싱과 심볼 추출을 모두 지원합니다.

## 가장 적합한 경우

- 모듈, 타입 클래스, 인스턴스가 많은 Haskell 서비스와 라이브러리.
- 데이터 타입 하나를 바꾸면 멀리까지 영향이 미치는 컴파일러, 파서, 그 밖의 코드베이스.
- 리팩터링 전에 AI 에이전트로 낯선 Haskell 코드를 읽는 팀.

## 에이전트 워크플로

- 함수의 타입 시그니처를 바꾸기 전에 모든 호출자를 찾습니다.
- 어떤 타입 클래스의 인스턴스를 가진 타입을 나열합니다.
- 데이터 생성자가 어디서 만들어지고 어떤 함수가 그것을 사용하는지 추적합니다.

## 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` incoming)
- "`ToJSON` 인스턴스를 가진 타입은 무엇인가요?" (`dependency_search`)
- "요청이 어떻게 디코딩되고 검증되는지 추적해 줘." (`get_task_context`)

## 알려진 한계

- `map`, `foldr`, `fmap`, `pure`, `>>=` 같은 약 130개의 Prelude 및 기본 라이브러리 이름과 `Data.List`, `Control.Monad` 같은 모듈은 관계에서 걸러집니다. 이런 호출에는 `text_pattern_search`를 사용하세요.
- 문법에서 원시 함수 노드는 함수 타입도 나타내므로, `structural_search`의 `functions` 프리셋은 람다만 반환하고 `methods`와 `variables` 프리셋은 아무것도 선택하지 않습니다. 이름이 있는 함수에는 `find_symbol`를 사용하세요.
- 문학적 `.lhs` 파일은 전체가 Haskell 문법으로 읽히므로, 결과가 일부만 나올 수 있습니다.
- Haskell에는 데코레이터 구문이 없으므로, 데코레이터 관계는 적용 대상 아님으로 표시됩니다.

## 다음 단계

[빠른 시작](/ko/docs/quickstart)으로 저장소를 연결한 다음, [호환성 페이지](/ko/docs/compatibility)에서 지원 매트릭스를 확인하세요. 다른 함수형 코드베이스라면 [Elixir 가이드](/ko/languages/elixir)를 읽어 보세요.

## 엔진 세부 정보

- Haskell 지원은 `.hs`와 `.lhs`를 Haskell로 매핑합니다. 타입 클래스, `data` 타입, `newtype`은 타입이며, 공백에 의한 함수 적용과 중위 연산자 모두에서 호출을 인식합니다.
- `instance Eq Point`는 `Point`가 `Eq`를 구현한다고 기록하고, 같은 파일의 클래스 기본 구현을 대체하는 인스턴스 메서드는 오버라이드를 기록합니다.
- 데이터 생성자 적용은 인스턴스화로 계산되며, 약 130개의 Prelude 및 기본 라이브러리 이름은 관계에서 걸러집니다.

## 유용한 MCP 진입점

- `find_symbol`: 함수나 타입의 정의와 참조가 필요할 때 사용하세요. 구조 프리셋은 람다만 반환합니다.
- `dependency_search`: 타입 클래스에 incoming 탐색을 사용해 인스턴스를 가진 타입을 확인하세요.
- `get_task_context`: "요청이 어떻게 디코딩되고 검증되는지 추적해 줘" 같은 프롬프트에 사용하세요.
