2013-08-05 2 views
13

type으로 유형 동의어를 만들면 ghc/ghci는 명시 적으로 사용될 때마다 원래 유형 대신이 유형을 사용하지만 추론 된 유형에서 일치하는 동의어로 거꾸로 작동하지 않습니다. 유형에 대한 가장 "추상적 인"동의어를 얻는 것은 모나드 스택과 동의어의 동의어를 정의하는 복잡한 응용 프로그램 및 라이브러리를 배우는 데 매우 편리합니다.haskell에서 동의어를 해결할 수있는 방법이 있습니까?

누구나 그런 코드를 작성한 사람이 있습니까? 나는 그것이 역 추적 될 것이라고 상상하고 또한 몇 가지 가짜 후보를 생성합니다 (예 : String의 별칭 인 경우 String을 해결해야 할 때마다 두 가지 유형이 후보가됩니다). 그러나 특정 상황에서는 유용 할 수 있습니다.

+0

나는 '파이프'와 '렌즈'에 정말 유용하기 때문에 똑같은 아이디어로 주위를 돌아 다녔다. 원칙적으로 규칙처럼 작동하는 컴파일러 pragma를 지정하고, 추론 된 유형의 패턴을 일치시킨 후 동등한 유형의 동의어로 다시 작성하는 것이 가장 이상적입니다 (일치하는 항목이 여러 개인 경우 우선 순위 지정). –

+1

며칠 전 "Chthulu의 형식 서명"에 대해 언급 한 블로그 게시물을 생각 나게합니다. http://joelt.io/entries/yesod-in-production – BruceBerry

+0

gsoc 또는 이와 유사한 서비스에 적합합니다. – jozefg

답변

1

대답이 아니지만 질문입니다. 타입 동의어는 종종 "고급 코드"의 유형을 잘 나타내는 데 사용되지만, 그 유형을 하위 레벨/도우미 코드 (보다 구체적인 유형의 용어로 정의 됨)에 전달하자마자 시스템에서 어떤 유형을 추적해야합니까? 동의어가 적용됩니까? 다음 사항을 고려

type Title = String 
type Name = String 

capitalise :: String -> String 

my_title = "Mayor" :: Title 

shouted_title = capitalise my_title :: ??? 

어떻게 typechecker는 문자열 capitalise 개념적으로 capitalise 나오는 문자열과 같은 유형입니다 heleper 기능에가는 것을 알고 있나요? 여러 유형의 별칭이있는 경우 유형 검사기에서 사용할 유형을 어떻게 선택해야합니까?

0

Frege 컴파일러, IDE 및 REPL은 "nice"유형을 표시하라는 요청을받을 때 유형 응용 프로그램 (->)의 응용 프로그램을 제외하고이 작업을 시도하며 대부분의 경우 작동합니다. 여기에 예제 online session 조각입니다 :

frege> type Flubber = (Int, Double) 
frege> x = (42, 3.0) 
frege> :t x  
Flubber 
frege> y = [x,x,x,x] 
frege> :t y 
[Flubber] 

따라서, 원칙적으로, 또한 하스켈에서 작동합니다 (아마 하스켈 2010 타입 시스템과 관련된 특정 확장 모듈로).

@ Thomas가 그의 답변에서 지적했듯이 형식 별칭을 대체 할 수없는 여러 가지 방법이있을 수 있으므로 출력이 실제로 오도 할 수 있음을 명심하십시오.

관련 문제