저는 Graham Hutton이 Haskell에서 프로그래밍하고있는 8 장에 있습니다. 코드를 복사하고 GHC에서 테스트하고 있습니다.sat 함수의 "Programming in Haskell"오류가 발생했습니다.
여기에 슬라이드를 참조하십시오 http://www.cis.syr.edu/~sueo/cis352/chapter8.pdf 특히 슬라이드 15
지금까지 복사 한 관련 코드는 다음과 같습니다
type Parser a = String -> [(a, String)]
pih_return :: a -> Parser a
pih_return v = \inp -> [(v, inp)]
failure :: Parser a
failure = \inp -> []
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
parse :: Parser a -> String -> [(a, String)]
parse p inp = p inp
sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
if p x then pih_return x else failure
나는 pih_return
에 책에서 return
함수의 이름을 변경 한 그래서 그것은 Prelude return
함수와 충돌하지 않습니다.
오류는 마지막 기능 sat
에 있습니다. 이 책에서 직접 복사했습니다. 그 첫 번째 오류 그래서
당신은 아마 p
를 볼 수있는 바와 같이, 유형 [(Char, String)]
이다 Char
에서 (예를 들어, isDigit
) Bool
및 x
하는 기능입니다.
pih_return
값이 v
이고 이 String
인 경우 [(v, inp)]
을 반환합니다. 이 경우 v
이 전달되는 x
이 Char
이 아니므로 sat
에 오류가 발생합니다.
나는 명시 적으로이 문제를 해결하는 가장 좋은 방법입니다 sat
sat :: (Char -> Bool) -> Parser Char
sat p inp = do x <- item inp
if p (fst x) then pih_return (fst x) inp else failure inp
에 inp
을 포함하여,이 솔루션과 함께 올라와있다?
슬라이드 11은 아래의 @ Rüdiger Hanke가 링크를 제공 한 전체 라이브러리 버전을 나타냅니다. 사실, 슬라이드 덱은 슬라이드 11 이전의 모든 코드가 첫 번째 버전 일 뿐이며 슬라이드 11 이후의 모든 코드는 라이브러리 파일의 Monadic 버전과 함께 사용되도록되어 있음을 분명히하지 않습니다. – MtnViewMark
아. 고마워, MntViewMark. 그것은 사물을 설명합니다. "이 파서의 모나드 성질에 관한 기술적 인 이유 때문에, 라이브러리의 기본 정의의 번호는 그것들과 약간 다릅니다. 여기에 주어진 ". –