Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在haskell中找到所有括号的组合?_Haskell_Types - Fatal编程技术网

在haskell中找到所有括号的组合?

在haskell中找到所有括号的组合?,haskell,types,Haskell,Types,我正试图编写一个简单的代码来生成所有括号的组合。但是我遇到了一个简单的类型错误 balancedParens :: Int -> [String] balancedParens n | n==0 = [] | otherwise = placeParens 0 1 0 n [""] where placeParens x lc rc n mlist | lc

我正试图编写一个简单的代码来生成所有括号的组合。但是我遇到了一个简单的类型错误

balancedParens :: Int -> [String]
balancedParens n
            | n==0 = []
            | otherwise = placeParens 0 1 0 n [""]
          where placeParens x lc rc n mlist
                                | lc == n = mlist
                                | rc == n = mlist
                                | lc < n = placeParens (x+1) (lc+1) rc n ((mlist !! x) ++ "L")
                                | rc < n = placeParens (x+1) lc (rc+1) n ((mlist !! x) ++ "R")
失败,已加载模块:无

((mlist!!x)+“L”)是一个列表,为什么会出现类型错误?为什么它与[Char]匹配?

问题陈述 让我们归纳地定义什么是平衡字符串:

  • 是平衡的
  • 如果
    x
    y
    是平衡的,
    “(++x++”)++y
    是平衡的
所有平衡字符串都可以使用上述规则构造

有限情形 我们要枚举所有具有精确的
n
括号的平衡字符串。我们遵循上述归纳规则

paren :: Int -> [String]
paren 0 = [""]
paren n = [ "(" ++ x ++ ")" ++ y
          | m <- [0..n-1] , x <- paren m , y <- paren (n-1-m) ]
这比paren更简单,因为我们不需要计算括号的数量

GHCi中的快速测试:

> take 20 $ runOmega allParen
["","()","()()","(())","()()()","(())()","(()())","()(())","(())()()","(()())()","((()))","()()()()","(())(())","(()())()()","((()))()","(()()())","()(())()","(())()()()","(()())(())","((()))()()"]

mlist
是字符串列表,
mlist!!x
是一个字符串,
(mlist!!x)+“L”
也是一个字符串。你需要字符串列表,你有一个字符串,它是一个列表还是[Char],你是说像这样的程序吗?omega版本不会按长度递增的顺序计算字符串。为什么?@n.m.Omega没有这样的保证:它应用了一个吻合/对角化函数,将所有无限组合减少到一个列表中。每个组合在最终列表中的显示顺序没有重要属性。换句话说,
join
的类型大致相当于
[[a]]->[a]
,但它比
concat
更复杂,在无限多的线程中充当一个公平的调度程序,每个线程生成一个列表
[a]
@n.m。我意识到我为我的不同代码粘贴了输出。现在我用实际版本进行了编辑。我只是试着比较omega版本和我的简单记忆版本的性能,并意识到这种比较是不公平的,因为它们计算结果的顺序不同。@n.m.我喜欢你的解决方案不使用自然,而是被记忆(不像我的)。它还以可预测的顺序生成结果。您可以添加一些评论,并将其作为答案发布在这里。
import Control.Monad.Omega

allParen :: Omega String
allParen = return ""
       <|> (\x y -> "(" ++ x ++ ")" ++ y) <$> allParen <*> allParen
> take 20 $ runOmega allParen
["","()","()()","(())","()()()","(())()","(()())","()(())","(())()()","(()())()","((()))","()()()()","(())(())","(()())()()","((()))()","(()()())","()(())()","(())()()()","(()())(())","((()))()()"]