2016-05-19 62 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