は、コードのちょっと巨大な作品であるとして、それは最終的理由モナドもので、巨大だが、タスクは簡単です:データ構造に次の文字列を解析:Haskellの怠惰質問や、なぜこのモナドが動作していないここに期待
」 hello "、" hello "、" hello "、" hello "、" sym "、"( ")、" args "、" some、args " 、( -
"ハロー(一部、引数)"> [( "FID"、 "")、( "SYM"、 "("))] iが書き込ま
が、コードは、次の生成します"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