所以,我正在读一本书,“形式语言理论导论”,它描述了一种语言L(G) = {a^n ++ b^n | n > 0}
。
它有以下作品:
S -> ab | aSb
因此会产生以下语言:
a, ab, aabb, aaabbb, ...
我想知道如何使用Haskell的列表理解来创建这种语言。我知道我可以使用字符串进行列表理解,但我几乎是初学者,并且不确定如何获得我想要的无限列表。
我想象的是:
[ x ++ y | x <- ["a","aa",..] y <- ["b","bb",..]]
答案 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