2017-09-25 45 views
5

Tak więc czytałem książkę "Wprowadzenie do formalnej teorii języka" i opisano język L(G) = {a^n ++ b^n | n > 0}.Balanced Language, 2 symbole nieterminalne, zrozumienie listów

Posiada następujące produkcje:

S -> ab | aSb 

I tak da następujący język:

a, ab, aabb, aaabbb, ... 

Zastanawiałem się, jak mogę używać Haskell za listowych do stworzenia tego języka. Wiem, że potrafię spisywać zrozumienie za pomocą łańcuchów, ale jestem początkującym i nie byłem pewien, w jaki sposób mogę uzyskać nieskończoną listę, jaką bym chciał z tych łańcuchów.

Wyobrażam sobie coś takiego:

[ x ++ y | x <- ["a","aa",..] y <- ["b","bb",..]] 
+1

To nie robi dokładnie to, co myślisz, że jest. Co powiesz na '[replicate n 'a' ++ replicate n 'b' | n <- [1 ..]] '? To wydaje się najwierniejsze tłumaczenie ... – Alec

+1

"a" nie jest częścią tego języka. –

Odpowiedz

8

roboczych od reguły produkcji,

S -> ab | aSb 

moglibyśmy napisać

s = ["ab"] ++ [ "a" ++ x ++ "b" | x <- s ] 

tak że

~> take 5 s 
["ab","aabb","aaabbb","aaaabbbb","aaaaabbbbb"] 
it :: [[Char]] 

Twoja próba może pracować z małym edycji,

[ x ++ y | x <- ["a","aa",..] | y <- ["b","bb",..]] 

tak, że używa Parallel List Comprehensions rozszerzenie (:set -XParallelListComp w GHCi), z wyjątkiem tych wyliczeń. Ale to jest proste do naprawienia,

[ x ++ y | x <- [replicate n 'a' | n <- [1..]] 
     | y <- [replicate n 'b' | n <- [1..]]] 
+0

Szybka obserwacja, zauważyłem, że kiedy napisałem 's = [" ab "] ++ [" a "++ x ++" b "| x <- s] 'w ghci, to powoduje błąd, ale jeśli umieściłem go w test.hs, a następnie: l test, to działa! Czy wiesz, jaka jest różnica? – user6189164

+0

jaki był błąd? czy próbowałeś użyć 'let', jak' let s = ... '(musisz, w przypadku, gdy masz starszą wersję zainstalowaną). –

+0

ah, powiedział ": 2: 3: błąd analizy na wejściu '=''; ale jeśli masz rację, jeśli użyję, pozwól działać! – user6189164