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