Printing an arrow of asterisks in Haskell

This code will print an arrow of asterisks, like:

*
**
***
****
***
**
*


raisingAsterisks, decreasingAsterisks, arrow :: Int -> [String]
raisingAsterisks n = take n $iterate ('*' :) "*" decreasingAsterisks = reverse . raisingAsterisks arrow n = raisingAsterisks n ++ (tail (decreasingAsterisks n)) main :: IO() main = mapM_ putStrLn$ arrow 4

• Related: A Java version of the same thing. Maybe some inspiration? (I don't speak Haskell much) – Simon Forsberg Sep 13 '15 at 19:26
• @SimonForsberg yes, I just write a program in Haskell to get the same output – Caridorc Sep 13 '15 at 19:27

The way you're actually generating the list of Strings seems fine, but the formatting, at least in my opinion, can be improved: since raisingAsterisks and decreasingAsterisks are both relatively small "helper" functions for arrow, I would suggest putting them inside a where clause to make things a little easier to read.

arrow :: Int -> [String]
arrow n = increasing ++ tail decreasing
where increasing = take n \$ iterate ('*' :) "*"
decreasing = reverse increasing


In this context, the variable names could be shortened, due to the fact that it's easy to understand what's happening. Note that the n variable no longer needs to be passed, so increasing and decreasing actually are no longer even functions!

I hope you agree that changing your code just a little greatly improves readability.

• I like this simplification. The best first posts are answers, welcome to CodeReview :D – Caridorc Sep 13 '15 at 20:52
• Also, the increasing list is now generated only once. (And it will be kept complete in memory anyway because of reverse.) – Carsten S Sep 13 '15 at 23:03