예상대로 작동하지 않는 이유는 게으름 질문이나 좀 코드의 거대한 조각 하스켈, 마침내 때문에 모나드 물건의 거대한 가지고 있지만, 작업은 간단하다 : 데이터 구조에 다음과 같은 문자열을 구문 분석 :이 모나드 여기
" hello (some, args) "-> [("fid ","hello "), ("sym ","("), ("args ","some, args "), ("sym " (-
"헬로 (일부 인수)"> [("FID" "") ("SYM", "("))] 나 기록
이지만, 코드는 다음과 생산 "args", ""), ("sym", ")")]
'args'와 'fid'값이 어딘가에 없어 졌기 때문에 컴파일러가 어떤 신비한 이유로 계산하지 않기로 결정했습니다. "?"
나는 또한 내가 함께 나에게 쓸모없는 것 '의 부품을 표시하지만, 컴파일러는 장소 :
을 그들을 떠나 저를 강제로 그리고 여기 코드, 코드가 완전히 나쁜 것 같다 :
type PStream = String
type PToken a = (String, a)
data Pstate a = Pstate (String -> ([PToken String], PStream)) a
instance Monad Pstate where
return x = Pstate (\_ -> ([("start", "")], "?")) x -- not used ?
(Pstate bindparser v) >>= f = Pstate newparser fv
where
Pstate fparser fv = f v
(btok, brest) = bindparser "this string also not used"
(tok, rest) = fparser brest
newparser _ = (btok ++ tok, rest)
-- parsers
parseFid :: Pstate String
parseFid = Pstate parser "???"
where parser r = let (fid, rest) = span (/= '(') r in ([("fid", fid)],rest)
parseSym :: Char -> Pstate String
parseSym c = Pstate parser "???"
where parser r = let rest = parseOne c r in ([("sym", [c])],rest)
parseOne s (h:t) = if h == s then t else error $ "symbol not match:" ++ [h] ++ " /= " ++ [s]
parseOne s [] = []
parseArgs :: Pstate String
parseArgs = Pstate parser "???"
where parser r = let (args,rest) = span (/=')') r in ([("args", args)],rest)
-- util
load :: String -> Pstate String
load s = Pstate (\ls -> ([("load", "")],ls)) "???"
runP :: Pstate String -> ([PToken String], PStream)
runP (Pstate fparser fv) = fparser "???"
-- combined parser
parseFunction :: String -> Pstate String
parseFunction s = do
load s --- should be 'return' here ?
parseFid
parseSym '('
parseArgs
parseSym ')'
main = putStrLn $ show $ runP $ parseFunction "hello(a b c)"
이 경우 모나드가 무엇을하는지 이해하지 못했던 것처럼 보입니다. 내 대답이 당신이 찾고있는 것과 다르다면이 코드에 대해 좀 더 말해 줄 수 있습니까? – fuz