2017-04-13 10 views
1

문자열 목록에 대한 진리 테이블을 만들려고했습니다. 말, 나는 목록 ["a","b"]을 가지고 출력으로, 나는 일을 어떤 쉬운 방법이 있나요 [[("a",True),("b",True)], [("a",True),("b",False)], [("a",False),("b",True)], [("a",False),("b",False)]]Haskell에서 사용자 지정 데이터 형식의 Gen

진실 테이블에서 해당 인스턴스의 각

data TableRow = [(String,Bool)] 

로 정의 된 사용자 정의 데이터 유형 원하는 이? 지금까지 나는 아주 분명이


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

을하고있다, 이것은 확실히 내가 무엇을 기대 저를 포기하지 않습니다. makeRowStringBool을 입력하고 TableRow을 반환합니다.

이렇게하는 더 깨끗한 방법이 있습니까? 프로그램에 감사

+0

'makeRow'은 무엇입니까 (새 라인은 가독성을 위해 추가)? –

+0

카티 션 곱을 두 가지 목록으로 말하겠습니까? 목록에 대한 이해도를 알고 있습니까? – gspr

+0

'데이터 TableRow = [(String, Bool)]'이 (가) 유효하지 않습니다. 데이터 생성자 이름이 필요합니다. –

답변

1

문제는 genRow :: [String] -> [TableRow]에게 TableRow 요소의 목록을 생성하는, 당신은 TableRow[[(String,Bool)]] 때문에 (String,Bool)TableRow A의 단점을 (:) 생성자를 사용할 수 없습니다.

당신은 그러나 쉽게 그것을 위해 지능형리스트을 사용할 수 있습니다 다음 빈리스트 결과 [] (안 빈리스트 :

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

첫 번째 문은 따라서 하나 개의 요소으로 목록 을 생성한다). 또한 우리는 목록 이해법을 사용합니다 : 및 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)]] 

+0

와우는 많은 의미가 있습니다. 정말 고맙습니다. 필자는리스트의 독해력을 잘 모르고 있었고,이 특별한 구문을 알지 못했습니다. 명확히하기 위해, 'genRow (x : xs) = [(x, b) : ti | b <- [True, False], ti <- ts> 여기서 ts = genRow xs' 각각의 경우 True 및 False에 대해 별도의 목록을 만들기 때문에이 방법이 효과가 있습니까? –

+0

* 별표 *로 무엇을 의미합니까? –