2017-09-25 72 views
5

所以,我正在讀一本書,「形式語言學導論」,它描述了一種語言L(G) = {a^n ++ b^n | n > 0}平衡語言,2非終端符號,列表理解

它具有以下作品:

S -> ab | aSb 

因此會產生下列語言:

a, ab, aabb, aaabbb, ... 

我想知道我怎麼可以使用Haskell的列表解析創建這門語言。我知道我可以使用字符串進行列表理解,但我幾乎是初學者,並不確定如何獲得像我想要的這些字符串那樣的無限列表。

我想象的是這樣的:

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

這不是你所想的那樣。怎麼樣'[replicate n'a'++ replicate n'b'| n < - [1 ..]]??這似乎是最忠實的翻譯... – Alec

+1

「a」不是該語言的一部分。 –

回答

8

從生產規律的工作,

S -> ab | aSb 

我們可以寫

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

使

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

你可以嘗試用小編輯工作,

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

,以便它使用Parallel List Comprehensions擴展(:set -XParallelListComp在GHCI),除了枚舉。但這很容易解決,

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

快速跟進,我注意到當我寫's = [「ab」] ++ [「a」++ x ++「b」| x < - s]'在ghci中,它會拋出一個錯誤,但是如果我把它放在test.hs中,然後:l測試,它會起作用!你知道有什麼不同嗎? – user6189164

+0

錯誤是什麼?你嘗試過使用'let',就像'let s = ...'(如果你安裝了舊版本的話,你必須使用)。 –

+0

啊,它說':2:3:解析輸入錯誤'='';但是,如果你是對的,如果我用它讓它工作! – user6189164