Run-length encoding in Haskell
You want to import only the functions you're actually going to need:
import Data.List     (group)
import Control.Arrow ((&amp;&amp;&amp;))

As Gurkenglas already said, use concatMap instead of concat . map. This leads to
runLengthExpand :: [(Int, a)] -&gt; [a]
runLengthExpand = concatMap (uncurry replicate)

Your runLengthCompress is fine, although (&amp;&amp;&amp;) might not be known to newcomers.
Now, areInverses is too obfuscated:

About the code itself I fear I have written too little points (arguments) to my functions, hindering readability but I am not sure, maybe the lack of points makes it more readable, not less.

Pointfree style isn't necessarily easier to read:

5 Problems with pointfree
Point-free style can (clearly) lead to Obfuscation when used unwisely.

We can split its functionality in multiple functions:
isInverseOn :: Eq a =&gt; (a -&gt; b) -&gt; (b -&gt; a) -&gt; a -&gt; Bool
isInverseOn f g x = x == g (f x)

areInverses :: Eq a =&gt; (a -&gt; b) -&gt; (b -&gt; a) -&gt; [a] -&gt; Bool
areInverses f g = all (isInverseOn f g)

This removes the need for =&lt;&lt; completely and is easier to read than your previous (==) =&lt;&lt; f . g.
However, that only checks whether g is an inverse of f, not whether f is the inverse of g. For example, g's codomain might not be the completely covered by f's domain. So a proper areInverses should also check isInverseOn g f for some appropriate values.
You can use QuickCheck to generate appropriate strings and lists of pairs, although you need to generate the latter by hand.