대수 데이터를 사용한 구속 조건 기반 유형 유추


11

ML 계보의 표현 기반 언어를 연구하고 있으므로 자연스럽게 형식 유추가 필요합니다.

이제 EOPL (Friedman and Wand)의 간단한 구현을 기반으로 유형을 유추하는 문제로 제약 조건 기반 솔루션을 확장하려고하지만 대수 데이터 유형을 우아하게 회피합니다.

지금까지 내가 한 것은 매끄럽게 작동합니다. 식이 경우 e이고 a + b, e : Int, a : Intb : Int. 경우 e일치하는 것입니다,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

나는 바로 그를 추론 할 수있다 t(e) = t(the whole match expression), t(n) = t(0) = t(n'), t(match) = t(1) = t(n' * fac(n - 1)등등 ...

그러나 대수 데이터 유형에 관해서는 확실하지 않습니다. 필터와 같은 기능을 가정하십시오.

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

리스트 타입이 다형성을 유지하기 위해서는 Cons 타입이되어야합니다 a * a list -> a list. 따라서 이러한 제약 조건을 설정할 때 분명히 이러한 유형의 대수 생성자를 찾아야합니다. 이제 문제는 대수 생성자의 여러 용도에 대한 '문맥 감도'입니다 a. 각 사례는 동일해야합니까?

나는 이것에 대한 일반적인 해결책을 찾는 데 어려움을 겪고 있으며 이것에 관한 많은 문헌을 찾을 수 없습니다. 제약 조건 기반 형식 유추를 가진 표현 기반 언어와 비슷한 것을 찾을 때마다 대수 데이터 형식과 다형성이 부족합니다.

모든 의견을 보내 주셔서 감사합니다!


@Guy 나는 고맙게 들리는 것을 의미하지는 않지만 기성품 솔루션을 찾고 있지 않습니다. 제안 사항이 있습니까? 내가 찾을 수있는 대부분의 기존 문서 (ML, OCaml의 INRIA 논문 등)는 필요한 것보다 훨씬 광범위합니다 (이해할 수 있음).
Kris

ATTAPL 의 추론 장으로 시작 하겠습니다. 접근 가능한 수준에서 필요한 모든 것을 논의한다고 생각합니다.
Gilles 'SO- 악마 중지'

@Gilles 저는 ATTAPL이 제 책장에없는 유일한 '클래식'PL 책이라고 생각합니다. P하지만 고마워요, 월요일에 살펴볼 것입니다. 저는 사무실에 10 개의 사본이 배포 된 Uni의 한 층에 앉아있을 것입니다. )
Kris

@Kris이 문제를 해결하는 접근 가능한 리소스를 찾은 적이 있습니까? "mini ML"의 구현은 정확히이 문제에 갇혀 있습니다 ... ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) 에서 관련 장을 발견하고 대수에 대한 섹션을 훑어 보았습니다. 데이터 유형이지만 머리가 약간 두렵습니다.
michiakig

@spacemanaki 그렇습니다. pdfs.semanticscholar.org/8983/… 을 발견 한 바로 이것에 대한 훌륭한 자료가되었습니다.
Kris

답변:


2

참조 : 미니 ML 특히 유형 추론 섹션을.

여기에는 간단한 기능 언어의 완전한 파서를위한 F #의 샘플 코드가 포함되어 있습니다. 더 중요한 것은 Type Inference 섹션은 ​​대부분의 Type 추론 시스템에서 발견되는 Hindley-Milner 알고리즘을 구현한다는 것입니다. 저자는 Hindley-Milner를 이해하는 데 도움이되는 다른 두 가지 중요한 문서에 대한 링크도 제공합니다. 하나는 일종의 높은 수준의 소개이고 다른 하나는 코드에서 알고리즘의 구현을 설명하는 논문입니다.


단일 링크는 일반적으로 답이 아닙니다. 무엇을 찾을 수 있고 왜 도움이되는지 자세히 설명하십시오.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.