2017-04-13 18 views
1

私は文字列のリストの真理値表を作成しようとしていました。 言って、私はリスト["a","b"]を持ち、出力として、私はやってのいずれかの簡単な方法があります ​​Haskellのカスタムデータ型のGen

真理値表におけるそれらのインスタンスのそれぞれが

data TableRow = [(String,Bool)] 

として定義されたカスタムデータ型ですたいですこの?今まで私はかなり明らかにこの


genRow :: [String] -> [TableRow] 
genRow [] = [] 
genRow (x:xs) = ((makeRow x True) : genRow xs) ++ 
      ((makeRow x False) : genRow xs) 

をやっている、これは非常に私が期待するものを私に与えるものではありません。 makeRowにはStringBoolが入力され、TableRowが返されます。

これを行うためのクリーナー方法はありますか?おかげ

+0

'makeRow'は何をするのか(新しい行は読みやすくするために追加されましたか)? –

+0

デカルト積を2つのリストにしたいと言っていますか?あなたはリスト内包を知っていますか? – gspr

+0

'data TableRow = [(String、Bool)]'は無効です。データコンストラクタ名が必要です。 –

答えて

1

はあなたのプログラムに問題がgenRow :: [String] -> [TableRow]TableRow要素のリストを生成し、TableRow[[(String,Bool)]]あるので、あなたは(String,Bool)TableRowに短所に(:)コンストラクタを使用することができないということです。

ただし簡単にそのためのリストの内包を使用することができます。空のリスト結果として[](ない空のリスト:

genRow :: [String] -> [[(String,Bool)]] 
genRow [] = [[]] 
genRow (x:xs) = [(x,b):ti | b <- [True,False], ti <- ts] where ts = genRow xs

最初の文は、このように一つの要素でリストを生成する必要があります)。さらに、リストの理解度を使用して、Bool s TrueFalsebとし、それぞれの値に対して可能な値の尾として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)]] 

+0

うわー、それはたくさんの意味があります。どうもありがとうございます。私はリスト内包をあまり知らず、この特定の構文を知らなかった。明確にするために、 'genRow(x:xs)= [(x、b):ti | b < - [True、False]、ti < - ts> ここで、ts = genRow xs' それぞれの場合にTrueとFalseの別のリストを作成するため、これは機能しますか? –

+0

*別リスト*とはどういう意味ですか? –

関連する問題