Haskell Function Composition - (a -> b) -> (a -> c) -> (b -> c -> d) -> (a -> d)
<p>I would like to learn how the following would be done in point-free:  </p>

<pre><code>withinBounds :: [Int] -&gt; Bool
withinBounds xs = (all (&gt;= 0) xs) &amp;&amp; (all (&lt;= 8) xs)
</code></pre>

<p>I understand that it is superior to write it this way for readability/sanity's sake, but I'd like to learn more about how I can compose functions. I've been scratching my head as to how I can do this. 
The whole (expanded?) type signature is  </p>

<pre><code>[Int] -&gt; ([Int] -&gt; Bool) -&gt; ([Int] -&gt; Bool) -&gt; (Bool -&gt; Bool -&gt; Bool) -&gt; Bool
</code></pre>

<p>The type signature of the composition I'm trying to get to is</p>

<pre><code>(a -&gt; b) -&gt; (a -&gt; c) -&gt; (b -&gt; c -&gt; d) -&gt; (a -&gt; d)
</code></pre>

<p>I wrote the following as notes in a bastard-lambda form. If there is a way to somewhat simplify the problem with the lambda calculus, it'd be great if that could be explained too:</p>

<pre><code>\L@[] -&gt;  \f1@([] -&gt; Bool) -&gt; \f2@([] -&gt; Bool) -&gt; \f3@(Bool -&gt; Bool -&gt; Bool) -&gt; f3.(f1.L).(f2.L) 
</code></pre>

<p>In the above, <code>.</code> is application, <code>@</code> is capturing (so f3 is another name for (Bool -> Bool -> Bool)). 
Many thanks.</p>

<p>Edit: I know this is not the most optimal or reusable code, and I know turning this into point-free makes it worse in terms of readability etc. To clarify, I am asking how I can turn it into point-free <strong>because I want to learn more about haskell and composition</strong>.</p>

<p>Edit2: <a href="https://stackoverflow.com/questions/20279306/what-does-f-g-mean-in-haskell?rq=1">A really good SO answer on point-free</a></p>