It looks to me like it was written to highlight the symmetry of the problem and for clarity, not for speed. You can't just drop the laziness of the second argument since Semigroup
defines it that way, and in other contexts times the laziness of the second argument may be essential. To preserve the visual representation of the symmetry of the problem, you probably want to just add
val g2 = f2 // Force evaluation
(f1, g2) match { ...
or somesuch.
(It would be nice if by name arguments could be called lazy to automatically memoize them.)