平衡语言,2个非终端符号,列表理解

时间:2017-09-25 18:51:23

标签: haskell list-comprehension

所以,我正在读一本书,“形式语言理论导论”,它描述了一种语言L(G) = {a^n ++ b^n | n > 0}

它有以下作品:

S -> ab | aSb

因此会产生以下语言:

a, ab, aabb, aaabbb, ...

我想知道如何使用Haskell的列表理解来创建这种语言。我知道我可以使用字符串进行列表理解,但我几乎是初学者,并且不确定如何获得我想要的无限列表。

我想象的是:

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

1 个答案:

答案 0 :(得分:8)

使用生产规则

android:descendantFocusability="blocksDescendants"

我们可以写

S -> ab | aSb

这样

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

您的尝试可以使用小编辑

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

除了枚举之外,它在GHCi中使用Parallel List Comprehensions扩展名([ x ++ y | x <- ["a","aa",..] | y <- ["b","bb",..]] )。但这很容易解决,

:set -XParallelListComp