나는 이런 종류의 질문을하는 것을 정말로 싫어하지만 나는 나의 지혜의 끝 부분에있다. 나는 점진적인 파서를 쓰고 있지만 어떤 이유로 펑터 인스턴스를 구현하는 방법을 알 수 없다.이 점진적인 파서가 펑터인가, 만약 그렇다면`fmap`은 어떻게 구현 될까?
입력이 코 루틴에 파서에 의해 산출 된 데이터 유형입니다
입력 데이터 형식 : 여기에 코드 덤프입니다. 그것은 입력 문자의 현재 목록
data Input a = S [a] Bool deriving (Show)
instance Functor Input where
fmap g (S as x) = S (g <$> as) x
출력 데이터 타입
출력 파서를 코 루틴에 의해 산출 된 데이터 타입 코 루틴 및 광고 조건 단부에 의해 동작되는 것을 포함한다. 그것은 인 하나 완료 실패한 메시지, [B], 또는 부분 ([A] -> 출력 AB) [A]는 파서
data Output a b = Fail String | Done [b] | Partial ([a] -> Output a b)
instance Functor (Output a) where
fmap _ (Fail s) = Fail s
fmap g (Done bs) = Done $ g <$> bs
fmap g (Partial f) = Partial $ \as -> g <$> f as
파서 다시 전달 현재 버퍼이다
파서는 [A]를 취하고
data ParserI a b = PP { runPi :: [a] -> (Input a -> Output a b) -> Output a b }
펑터 구현
,174 AB 출력을 다시 산출 버퍼 [A] 동시 루틴을 수득내가 다음과 같은 코 루틴 위에 함수 g를 fmap 함수입니다해야 할 모든 것 같습니다 :
instance Functor (ParserI a) where
fmap g p = PP $ \as k -> runPi p as (\xs -> fmap g $ k xs)
를하지만 확인 입력하지 않습니다 필립 JF 선언으로
Couldn't match type `a1' with `b'
`a1' is a rigid type variable bound by
the type signature for
fmap :: (a1 -> b) -> ParserI a a1 -> ParserI a b
at Tests.hs:723:9
`b' is a rigid type variable bound by
the type signature for
fmap :: (a1 -> b) -> ParserI a a1 -> ParserI a b
at Tests.hs:723:9
Expected type: ParserI a b
Actual type: ParserI a a1
'ParserI'는 (는) 펑터가 아닙니다. 인스턴스가 없습니다. –
오 X (이유에 대해 설명해달라고 요청할 수 있습니까? 그리고 내가 그것을 functor가되도록 재구성 할 수 있습니까? 예를 들어 Attoparsec.Incremental (depreicated)의 경우 coroutine은 (c -> Input a -> Output ab), 그러나 나는 그곳에 무엇이 있는지를 알 수 없었다. – chibro2
'fmap gp = PP $ \ as k -> runPi p (\ xs -> fmap g $ k as)'- –