Ctrl+P again to print, arrows/tab to navigate results, enter to confirm

    All the Haskell golf tips I know of:

    Here's some advice that is often useful on code.golf specifically.

    Program layout

    Handling arguments

    import System.Environment
    main=getArgs>>=mapM(putStrLn.f).tail            -- Apply `putStrLn.f` to each arg but the first
    main=do _:a<-getArgs;mapM putStrLn[f x a|x<-a]  -- Also useful sometimes, if you need `a`.
    

    Printing a bunch of numbers line by line

    main=mapM print[n|n<-[1..100],some condition on n]
    

    Iterating and halting

    Write a recursive function without an "otherwise" guard to halt when a condition becomes false.

    -- Count down from 5 to 1:
    main=f 5
    f x|x>0=print x>>f(x-1)
    

    This prints 5 4 3 2 1 and then crashes with Non-exhaustive patterns in function f.

    Miscellaneous advice

    <>

    Try It Online and anagol don't export <> in Prelude yet, but code.golf does, and it is often useful.

    See this post for some <> tricks. putStr<>print and id<>reverse are nice.

    Integer vs. Int

    Haskell math operators have generic types like (^) :: (Num a, Integral b) => a -> b -> a, which means that the types of literal arguments may be inferred in surprising ways depending on the context of the result.

    Usually Haskell prefers to infer Integer (arbitrary-precision) as a concrete type for integer literals. But when some expression fills an Int-typed parameter, type inference propagates Int, a signed 64-bit integer type:

    main=print $ 2^64+4             -- prints 18446744073709551620
    main=print $ ['a'..]!!(2^64+4)  -- prints 'e', because (!!) :: [a] -> Int -> a
                                    --             so (2^64+4) must be an Int
    

    Watch out for Int-typed parameters in !!, take, drop, and fromEnum/toEnum.

    Compression

    This kind of pattern is useful:

    g '@'="Haskell"
    g '#'="golf"
    g c=[c]
    main = putStrLn ("Tips for @ #ing, that is, code # in @.">>=g)
    

    Also, mapM is often useful. See this answer for a nice example.