[英]Gen for a custom data type in Haskell
我試圖為字符串列表制作真值表。 說,我有一個列表["a","b"]
作為輸出,我想要[[("a",True),("b",True)], [("a",True),("b",False)], [("a",False),("b",True)], [("a",False),("b",False)]]
真值表中的每個實例都是自定義數據類型,定義為
data TableRow = [(String,Bool)]
有沒有更簡單的方法來做到這一點? 直到現在我一直在這樣做
genRow :: [String] -> [TableRow]
genRow [] = []
genRow (x:xs) = ((makeRow x True) : genRow xs) ++
((makeRow x False) : genRow xs)
很明顯,這並不完全符合我的期望。 請注意, makeRow
只接受一個String
和一個Bool
並返回一個TableRow
。
有沒有更干凈的方法來做到這一點? 謝謝
您的程序的問題在於genRow :: [String] -> [TableRow]
生成一個TableRow
元素列表,並且您不能在(String,Bool)
和TableRow
上使用 cons (:)
構造函數(String,Bool)
因為TableRow
是[[(String,Bool)]]
。
但是,您可以輕松地使用列表理解:
genRow :: [String] -> [[(String,Bool)]]
genRow [] = [[]]
genRow (x:xs) = [(x,b):ti | b <- [True,False], ti <- ts] where ts = genRow xs
因此,第一條語句應該生成一個包含一個元素的列表:空列表[]
(不是作為結果的空列表)。 此外,我們使用列表推導式:我們對b
的兩個Bool
s True
和False
進行迭代,對於每個這樣的值,我們將可能的值迭代為尾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)]]
(為了可讀性添加了新行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.