ile çalışır. Dengelenmiş parantez sorununu çözmeye çalışıyorum. Sürekli IO yapmak istemiyorum, ve sadece bir arama yapmak ve sonuçta ortaya çıkan dizeyi ayrıştırmak istiyorum. Bu nedenle, sorunu çözen işlev, iki farklı durumu ele alır: Girdi dizesinin tükenmeyen kısmı ve parantez yığını.Normal monadik işlevler oluşturmak, monad trafo eşdeğeri
Bir yığın manipüle bazı fonksiyonlarının ayarlanması için istiyorum: ancak Durumluk monad faaliyet ediyorum
type Stack = String
pop :: Stack -> (Char,Stack)
pop (x:xs) = (x,xs)
push :: Char -> Stack -> ((),Stack)
push a xs = ((),a:xs)
Ben devlet monad faaliyet ediyorsam hepsi iyi
balanced :: StateT Stack (State String) Bool
Yığında yinelenen monadlara sahip olmamam söylendi. Bu şekilde yapıyorum çünkü itme ve pop tanımlamalarını nasıl basitleştirdiğini seviyorum.
İki sorun:
- Ne yaparsam ne itmek uygulamak ve Durumluk içerdiği Stack pop için bir yol bulmak mümkün değil.
- Ben ana işlevi İşte
bu çağırmak için nasıl hiçbir fikrim yok
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
İç monad için 'State String 'yerine' Reader String' kullanmayı deneyin. – dflemstr