2016-07-29 2 views
2

모나드에서 나오는 함수의 유형이 변경됩니다. GHCI에서GHCi의 모나드에서 나오는 함수의 유형이 변경되는 이유

:

> :t map 
map :: (a -> b) -> [a] -> [b] 
> a <- return map 
> :t a 
a :: (GHC.Prim.Any -> GHC.Prim.Any) 
-> [GHC.Prim.Any] -> [GHC.Prim.Any] 

이 변경은 하드 더 높은 순위 유형에서 함수를 저장 할 수 있습니다.

여기에 무슨 일이 일어나고 있으며 어떻게 될까요?

는 (? 또한이 모나드 법률을 위반하지 않는) 모든

+2

나는 이것이 이상한'ghci' 행동이라고 확신한다. 'λ>와 같은 것 <- return map; return (a (+ 1) [1,2,3])은 예상대로 작동합니다. –

답변

6

첫째, a <- return map 같은 아무것도 의미가 없습니다 - 잘 작동 let a = map 등의 동일. 즉


Any의 역할에 관해서는 우리에게 큰 힌트를 제공 GHC.Prim.Any의 문서를 체크 아웃 ... 나는 그 질문 생각하지 않습니다 말했다.

는 또한 유형 확인 후 취소 제한된 형태 변수를 인스턴스화하는 데 사용됩니다. 예를 들어, length

length :: forall a. [a] -> Int 

을 입력이없고 빈리스트의 목록 DATACON은 유형의 응용 프로그램이 필요합니다 length []이 두 용어를 구성하기 위해

[] :: forall a. [a] 

을 입력있다,하지만이 선택 항목에 제약 조건이 있습니다. 이 상황에서 GHC는

문제는 GHCi가 x <- return map을 볼 때 return map >>= \x -> ...에 desugar을 시도하는 것입니다 (length @Any ([] @Any *)과 같은 유형의 응용 프로그램 구문의 관점에서) Any

를 사용하지만 ... 부분은 무엇이든 GHCi 옆에 입력하십시오. 일반적으로 map의 유형 변수가 ...을 기반으로 인스턴스화 될 것인지 (또는 심지어 인스턴스화되어야하는지 여부)를 파악할 수 있지만 아무것도 없기 때문에 가능합니다.

지적 @ sepp2k 또 다른 중요한 점은 x은 (는 RHS에) 다형성 형태를 랭크 1 기능(>>=) 때문에 기대하는 주어진 수 없다고하고, 그 인수 다형성 수없는 것을 의미한다. (이 조건을 풀면하는 당신이 안정적으로 유형을 추론 할 수있는 능력을 잃게 점 RankNTypes로 직선을 푸시합니다.) 따라서

, 단형으로 x을 필요로하고 단형되는 것을 x을 방지 유형 변수를 인스턴스화하는 데 도움 아무런 정보가없는 기본값은 Any입니다. 즉, (a -> b) -> [a] -> [b] 대신 (Any -> Any) -> [Any] -> [Any]이 표시됩니다.

+0

함수 인자가 다항식이 될 수 없기 때문에'a'는 다형성 타입을 가질 수 없다는 것을 지적해야합니다 (함수가 상위 등급 함수가 아니라면'>> ='는 rank-1 함수를 취하지 않습니다)). – sepp2k

+0

@ sepp2k 좋은 지적! – Alec

+0

'a <- return map '은 단순히 최소한의 실행 가능한 예일뿐입니다. 나는 실제로 명령 행 옵션에서 다형 함수를 빌드하고 그 함수를 나중에 사용할 수 있도록 StateT 기반 모나드에 저장하려고합니다. 나는'a'가'a0' 타입의 에러가 아니라는 것을 계속해서 알았습니다. 또한 http://stackoverflow.com/questions/38648935 –

관련 문제