的問題與你的程序是genRow :: [String] -> [TableRow]
產生的TableRow
元素的列表,你可以不使用利弊(:)
構造上(String,Bool)
和TableRow
因爲TableRow
是[[(String,Bool)]]
。
但是,您可以輕鬆地使用列表理解爲:因此
genRow :: [String] -> [[(String,Bool)]]
genRow [] = [[]]
genRow (x:xs) = [(x,b):ti | b <- [True,False], ti <- ts] where ts = genRow xs
第一條語句應該生成一個列表一個元素:在空列表[]
(而不是空列表作爲結果)。此外,我們使用列表理解:我們遍歷的兩個True
和False
的b
,並且對於每個這樣的值,我們遍歷可能的值作爲尾部ts
並且將(x,b)
加到每個可能的尾部。
這給:
*Main> genRow ["A","B","C"]
[[("A",True),("B",True),("C",True)],
[("A",True),("B",True),("C",False)],
[("A",True),("B",False),("C",True)],
[("A",True),("B",False),("C",False)],
[("A",False),("B",True),("C",True)],
[("A",False),("B",True),("C",False)],
[("A",False),("B",False),("C",True)],
[("A",False),("B",False),("C",False)]]
*Main> genRow ["Foo","Bar"]
[[("Foo",True),("Bar",True)],
[("Foo",True),("Bar",False)],
[("Foo",False),("Bar",True)],
[("Foo",False),("Bar",False)]]
(新線增加了可讀性)
是什麼'makeRow'嗎? –
你是說你想要笛卡爾產品兩個列表?你知道列表解析嗎? – gspr
'data TableRow = [(String,Bool)]'無效。你需要一個數據構造函數的名字。 –