When I run the following code:
main = do
let smallTriplets xs ys zs = [ (x, y, z) | x <- xs, y <- ys, z <- zs, let sum = x y z, sum <= 10]
print (smallTriplets [1,2] [3,4] [5,6])
It gives the output:
[(1,3,5),(1,3,6),(1,4,5),(2,3,5)]
However, I want smallTriplets
to print the sum
with some customization. To be more specific, it will be better if I could replace let sum = x y z
in smallTriplets
with some code so that it gives output like:
Sum is 1 3 5 = 9
Sum is 1 3 6 = 10
Sum is 1 4 5 = 10
Sum is 2 3 5 = 10
I am expecting that code to have a string like "Sum is " show(x) " " show(y) " " show(z) " = " show(x y z) "\n"
How can I do that?
If this is not possible then please show me how to print:
Sum is 1 3 5 = 9
Sum is 1 3 6 = 10
Sum is 1 4 5 = 10
Sum is 2 3 5 = 10
CodePudding user response:
What's the problem of writing "Sum is " show x " " show y " " show z " = " show sum
instead of (x, y, z)
?
You could like this
main = do
let helper x y z s = "Sum is " show x " " show y " " show z " = " show s
let smallTriplets xs ys zs = [ helper x y z sum | x <- xs, y <- ys, z <- zs, let sum = x y z, sum <= 10]
putStr $ unlines $ smallTriplets [1,2] [3,4] [5,6]
Here, smallTriplets
returns a [String]
instead of a [(,,)]
; unlines
converts the [String]
to a String
with embedded \n
s; finally, putStr
prints the string.
This is a quick and dirty solution which alters the function smallTriplets
, so if you planned to use the original result in other ways this solution will not help.
If your aim is to log things you do, then a more complex solution is needed. Maybe using the writer monad?