 <p>If we simplify your example we will get:</p> <pre><code> val interests = Seq[String]().map { x =&gt; Option[Map[String, String]](Map("k" -&gt; "v")) }.fold(Map[String, String]())(_) </code></pre> <p>This means that we are trying to <code>fold</code> <code>Seq[Option[Map[String, String]]]</code> with initial value <code>Map[String, String]()</code>:</p> <pre><code>def fold[A1 &gt;: A](z: A1)(op: (A1, A1) =&gt; A1): A1 = foldLeft(z)(op) </code></pre> <p>From <code>fold</code> definition we can see that compiler expects that <code>Option[Map[String, String]]</code> (each value in folding) and <code>Map[String, String]</code> (init value) should be of the same type. </p> <p>If you inspect <code>Option</code> hierarchy you will see:</p> <p><code>Option</code> -> <code>Product</code> -> <code>Equals</code></p> <p>For <code>Map</code> we have the following:</p> <p><code>Map</code> -> <code>GenMap</code> -> <code>GenMapLike</code> -> <code>Equals</code> (traits hierarchy is complicated, may be another chains exist).</p> <p>So we can see tha the nearest common type is <code>Equals</code>.</p> <p>Second part of your puzzle is <code>(_)</code>. </p> <p>This is treated by compiler as an argument of lambda:</p> <pre><code>val interests = x =&gt; /*omited*/.fold(Map[String, String]())(x) </code></pre> <p>As we saw <code>x</code> is <code>(A1, A1) =&gt; A1</code>. And in our case it is:</p> <pre><code>(Equals, Equals) =&gt; Equals </code></pre> <p>The result of <code>fold</code> is <code>A1</code> which is also <code>Equals</code>.</p> <p>As a result lambda type is:</p> <pre><code>((Equals, Equals) =&gt; Equals) /*&lt;&lt; arg*/ =&gt; /*result &gt;&gt;*/ Equals </code></pre> <p><strong>UPDATE:</strong></p> <p>To solve your problem I think you should use:</p> <pre><code>.flatten.reduce(_ ++ _) </code></pre>