簡體   English   中英

在 Haskell 中生成自定義數據類型

[英]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 TrueFalse進行迭代,對於每個這樣的值,我們將可能的值迭代為尾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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM