Home > Software design >  Print Custom String With the Sum of Three Lists
Print Custom String With the Sum of Three Lists

Time:10-29

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 \ns; 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?

  • Related