본문으로 건너뛰기
cd /languages
  • 순수 함수형
  • 프로그래밍
  • AST 및 심볼 지원

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

Maguyva는 AST, 심볼, 그래프로 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 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에는 데코레이터 구문이 없으므로, 데코레이터 관계는 적용 대상 아님으로 표시됩니다.

다음 단계

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

가장 적합한 경우

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

에이전트 워크플로

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

엔진 세부 정보

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

유용한 MCP 진입점

  • find_symbol

    함수나 타입의 정의와 참조가 필요할 때 사용하세요. 구조 프리셋은 람다만 반환합니다.

  • dependency_search

    타입 클래스에 incoming 탐색을 사용해 인스턴스를 가진 타입을 확인하세요.

  • get_task_context

    "요청이 어떻게 디코딩되고 검증되는지 추적해 줘" 같은 프롬프트에 사용하세요.