Minor point: Extensive use of GNU extensions, so not really C.
Major point: Very much easier to do this in C++ by overloading operators for list<>:
L2 = L1 + L3; // L2 is L1 concat L3
L2 = L1 < 3; // L2 is L1 elements less than 3
L2 = L1 | even; // L2 is L1 elements passed through a filter for even numbers
That is not an accurate translation. Using the two lists is not the same as using one list, then the other; it does the Cartesian closure. You've got other problems, too, such as the fact that won't compose anything like a monad will, but that will do for a start.
Monads are trivial to implement in other languages if you skip the way they use functions and thereby implement not-actually-a-Monad. I won't say C++ can't do a monad nicely but it certainly isn't going to be that easy.
Major point: Very much easier to do this in C++ by overloading operators for list<>: