Add in parentheses to show how this code actually parses:
(((putStrLn show) fac) 10)
You pass show as an argument to putStrLn , which is incorrect because show is a function and putStrLn expects a string. You want it to be like this:
putStrLn (show (fac 10))
You can either bracket it like this, or you can use the $ operator, which essentially braces everything that is to the right of it:
putStrLn $ show $ fac 10
source share