parsec을 사용하여 일부 소스 코드를 AST로 구문 분석합니다. 나는 최근에 "의심스러운"코드를 잡으려고 -Wall
과 -W
옵션을 사용했고 명시적인 확장자가없는 the parsec-related top-level functions in this file에 대해 불평하고 있습니다.parsec 유형 주석 이해
예 1
vimL = choice [ block
, statement
]
유추 유형은 여기에 있습니다 :
vimL :: ParsecT String() Data.Functor.Identity.Identity Node
그래서, 그 주석을 추가 할 경우, 컴파일러는 내가 import
에 의미있는 Data.Functor.Identity.Identity
약 있지 않는 액세스를 불평 그것 :
import Data.Functor.Identity
그리고 만약 그렇게한다면, 나는 할 수있다. 형식 주석을 다음과 같이 수정하십시오.
vimL :: ParsecT String() Identity Node
및 컴파일러는 계속 허용합니다. 그러나 그것은 여전히 내가 아주 깊이 이해하고있는 것이 아닙니다.
link :: forall u.
ParsecT String u Data.Functor.Identity.Identity Node
그러나 나는 또한 사용하지 않는 것을 사용할 수 없습니다 :
예 2
link = Link <$> (bar *> linkText <* bar)
where
bar = char '|'
linkText = many1 $ noneOf " \t\n|"
유추 유형은 여기
{-# LANGUAGE RankNTypes #-}
주 나는 분배 할 수 그걸로 내가 forall
을 떨어 뜨리면. 이러한 작업을 모두 :
link :: ParsecT String u Data.Functor.Identity.Identity Node
link :: ParsecT String u Identity Node
예 3
string' s = mapM_ char' s >> pure s <?> s
이 하나의 추론 유형은 다음과 같습니다
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE KindSignatures #-}
:
는 하나를 사용하기 위해
string' :: forall s u (m :: * -> *).
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
, 나는 모두 필요
다시 말해서, 내가,583,210 나는 다음과 컴파일러가 아직도 그것을 수용에 유형을 단순화 할 수 있습니다 :
string' :: Stream s m Char => [Char] -> ParsecT s u m [Char]
매우 간단하지 않음을하지만. 더 나아가와 constaint을 삭제 :
{-# LANGUAGE NoMonomorphismRestriction #-}
그에서 저를 얻을 수 있지만 그렇지 않습니다 :
No instance for (Stream s m Char) arising from a use of ‘char'’
내가 생각 :
string' :: [Char] -> ParsecT s u m [Char]
내가 얻을.
질문
대부분이 내 머리 위로 갈이, 그래서 맹목적으로 첫번째 좀 더 통찰력을 확보하지 않고있는 추론 유형 서명을 복사하여 붙여 넣을하지 않습니다. 아무도 이러한 의미가 무엇인지 밝혀 낼 수 있습니까? parsec 무거운 코드에 주석을 달 수있는 모범 사례는 무엇입니까? forall
은 컴파일러 오류가 발생하지 않고 생략 될 수있는 경우 무엇을합니까? 그리고 가능한 모든 별칭 트릭이 있는지 여부 이들을 더 읽기 쉽도록 만드시겠습니까?
매우 도움이됩니다. 'string ':: forall s u (m :: * -> *). 문자열 Smars Char => [Char] -> ParsecT sum [Char]'는'string ':: String -> Parser String'이되었고, 나머지 대부분은'Parser Node','Parser String' 또는'Parser()'가되었습니다. . – wincent