Efficient Road Network Intro

I've decided to learn haskell, because I've always enjoyed the functional aspect of Python and want to explore other languages that use this concept. I'm still stumbling in the dark most of the time, so would greatly appreciate any improvements.

Description

Challenge source

A road system is considered efficient if it is possible to travel from any city to any other city by traversing at most 2 roads.

Example

For n = 6 and roads = [[3, 0], [0, 4], [5, 0], [2, 1], [1, 4], [2, 3], [5, 2]]

the output should be True

Here's how the road system can be represented:



Code

middlePoints k n roads  = [i | i &lt;- [0..n-1], elem [k,i] roads || elem [i,k] roads]

thoughMiddlePoints k x n roads = or [(elem [points !! i,x] roads || elem [x, points !! i] roads) | i &lt;- [0..(length points - 1)]]
    where
    points = middlePoints k n roads

reachable k x n roads = elem [k,x] roads || elem [x,k] roads || (thoughMiddlePoints k x n roads)

efficientRoadNetwork n roads = all (==True) [ all (==True)[(reachable i j n roads) | j &lt;- [0..n-1], i /= j] | i &lt;- [0..n-1]]
I find !! and once-used definitions smelly.

A passed around environment like roads might as well open a scope that spans all uses of it.

efficientRoadNetwork roads n = and
  [ edge i j || any (\k -&gt; edge i k &amp;&amp; edge k j) [0..n-1]
  | i &lt;- [0..n-1], j &lt;- [0..i-1]
  ] where edge i j = elem [i,j] roads || elem [j,i] roads