# [Haskell-cafe] Newbie: generating a truth table

Lennart Augustsson lennart at augustsson.net
Tue Feb 6 04:31:10 EST 2007

```It would be better to produce a triple (as was suggested)

loop = [(x, y, x&&y) | x <- [True, False], y <- [True, False]]

The you can map a function that prints over that.  Or even better
map a function that generates the strings, and the use one big
putStr at the end.  Always try to separate IO from computation.

-- Lennart

On Feb 6, 2007, at 10:18 , phiroc at free.fr wrote:

> Ketil,
>
> thanks for you help.
>
> Here's the code:
>
> and2 :: Bool -> Bool -> Bool
> and2 a b = a && b
>
>
> loop = [ and2 x y  | x <- [True,False], y <- [True,False] ]
>
>
> Now, how do I have Haskell print
>
> printStrLn("True and True = ") + <result of calling and2 True True>
> printStrLn("True and False = ") + <result of calling and2 True False>
> ...
>
> Thanks.
>
> phiroc
>
>
>
>
> Quoting Ketil Malde <Ketil.Malde at bccs.uib.no>:
>
>> phiroc at free.fr wrote:
>>> I would like to create a Haskell function that generates a truth
>>> table, for
>> all
>>> Boolean values, say, using the following "and" function :
>>>
>>> and :: Bool -> Bool -> Bool
>>> and a b = a && b
>>>
>> What is the type of the resulting table?
>>> I have tried creating a second function called "loop", which
>>> repeatedly
>> calls
>>> "and", but it did not work, because, for some reason unknown to
>>> me, "do"
>> does
>>> not like repeated function calls
>>>
>>> loop = do
>>> 	and True True
>>> 	and True False
>>>
>> I'm not sure I understand what you expected here.  The 'do' syntax
>>> Is there a better way to repeatedly call "and"?
>>>
>> If you want your table in list for, I'd suggest using a list
>> comprehension.
>>
>> Here's how you'd calculate squares of numbers, for instance:
>>
>>    squares = [ x^2 | x <- [1..5] ]
>>> Furthermore, is there a way in Haskell to loop through the
>>> Boolean values
>> (True
>>> and False)
>>>
>> Since there are only two values, you can just feed a list
>> comprehension
>> with [True,False].
>>> Last but not least, in the "loop" function above, assuming that
>>> there is a
>> way
>>> to repeatedly call the "and" function, how could you intersperse
>> "printStr"s
>>> between the "and" calls?
>>>
>> I would't - keep the the calculation and the output separate instead.
>>
>> -k
>>
>
>
> _______________________________________________