2016-05-19 64 views
0

这是我一直在通过列表理解工作的一个问题。我知道它应该用递归来解决,但我不确定Haskell语法对于递归情况如何工作。Haskell嵌套列表生成器

这里的问题:

给出一个字符串列表,输出这些字符串的所有可能的组合和3个变量[C,U,I]。例如,

list ["vC", "vU", "vI"] == 
       [[("vC",C),("vU",C),("vI",C)],[("vC",I),("vU",C),("vI",C)],[("vC",U),("vU",C),("vI",C)] 
       ,[("vC",C),("vU",I),("vI",C)],[("vC",I),("vU",I),("vI",C)],[("vC",U),("vU",I),("vI",C)] 
       ,[("vC",C),("vU",U),("vI",C)],[("vC",I),("vU",U),("vI",C)],[("vC",U),("vU",U),("vI",C)] 
       ,[("vC",C),("vU",C),("vI",I)],[("vC",I),("vU",C),("vI",I)],[("vC",U),("vU",C),("vI",I)] 
       ,[("vC",C),("vU",I),("vI",I)],[("vC",I),("vU",I),("vI",I)],[("vC",U),("vU",I),("vI",I)] 
       ,[("vC",C),("vU",U),("vI",I)],[("vC",I),("vU",U),("vI",I)],[("vC",U),("vU",U),("vI",I)] 
       ,[("vC",C),("vU",C),("vI",U)],[("vC",I),("vU",C),("vI",U)],[("vC",U),("vU",C),("vI",U)] 
       ,[("vC",C),("vU",I),("vI",U)],[("vC",I),("vU",I),("vI",U)],[("vC",U),("vU",I),("vI",U)] 
       ,[("vC",C),("vU",U),("vI",U)],[("vC",I),("vU",U),("vI",U)],[("vC",U),("vU",U),("vI",U)]] 

编辑:所以这是我到目前为止已经试过。

list :: [String] -> [Dict] 
list [] = [[]] 
list xs = [[(x,y)] | y<-[C,U,I], x <- xs] 

然而,当我用三个变量运行测试用例,它只输出:

[[("vC",C)],[("vU",C)],[("vI",C)],[("vC",U)],[("vU",U)],[("vI",U)],[("vC",I)],[("vU",I)],[("vI",I)]] 
+3

问题是什么?你尝试了什么?为什么它不工作? –

+2

你能告诉我们你已经尝试了什么,这似乎是功课/锻炼!请表现出尽可能多的努力,因为你会期望有人回答这个问题,写出答案。一个好的开始将阅读[信息页](https://stackoverflow.com/tags/haskell/info)=>部分**免费Haskell编程书籍** – epsilonhalbe

+2

编辑原始帖子添加我已经尝试过远,为什么它失败了。感谢您的资源。 – lancer

回答

1

好吧,让我们尝试让你有一步

也许你见过步骤评论已经但在这里是最重要的一步,但在这里:

list []  = [[]] 
list (x:xs) = [(x,c) : ys | c <- ???, ys <- list xs ] 

注意两个案件相应对两个名单构造者 - 这是典型的,你错过了第二个。

现在,你只需要:

  • 填充在???它应该很容易
  • 弄清楚如何解决顺序(IMO它会帮助你理解),因此,这将是什么你例如做

我猜你得到它 - 以防万一答案是:

list []  = [[]] 
list (x:xs) = [(x,c) : ys | ys <- list xs, c <- [C,I,U] ] 
+0

我确实找到了解决方案,并且已经标记为答案。谢谢卡斯滕。 – lancer