균형 브래킷 문제를 해결하려고합니다. 나는 연속적인 IO를하고 싶지 않고 getLine을 한 번 호출하여 결과 문자열을 파싱합니다. 따라서 문제를 해결하는 함수는 두 개의 다른 상태, 즉 입력 문자열의 소비되지 않은 부분과 대괄호 스택을 처리합니다.정상적인 모나 딕 함수를 모나드 변압기와 동일하게 만들기
내가 스택 조작하기위한 일부 기능을 설정하려면 : 그러나 나는 StateT 모나드에서 운영하고있어,
type Stack = String
pop :: Stack -> (Char,Stack)
pop (x:xs) = (x,xs)
push :: Char -> Stack -> ((),Stack)
push a xs = ((),a:xs)
나는 상태 모나드에서 운영하고있어 경우 모든 좋은
balanced :: StateT Stack (State String) Bool
스택에 모나드가 중복되지 않도록해야한다는 것을 알고 있습니다. 내가 푸시와 팝 정의를 단순화하는 방법을 좋아하기 때문에 나는 이렇게하고있다.
두 가지 문제 :
- 는 상관없이 내가 뭘 내가 푸시를 적용하고 StateT에 포함 된 스택에 팝업 할 수있는 방법을 찾을 수 없습니다.
- 나는 주요 기능 여기
에서이를 호출하는 방법을 아무 생각이
next :: String -> (Maybe Char,String)
next "" = (Nothing,[])
next (x:xs) = (Just x,xs)
balanced = do
c <- lift (state next)
case c of
Nothing -> return True
Just c -> if elem c open
then (push c) >> balanced
else if elem c close
then pop >>= \x ->
if eq x c
then balanced
else return False
else balanced
where open = "<{(["
close = "])}>"
eq '(' ')' = True
eq '{' '}' = True
eq '<' '>' = True
eq '[' ']' = True
eq _ _ = False
내부 모나드에 대해 'State String'대신 'Reader String'을 사용해보십시오. – dflemstr