Prelude> let f <$!> x = (f $!) <$> x
(<$!>) :: Functor f => (a -> b) -> f a -> f b
Prelude> let z = const True <$!> [undefined]
z :: [Bool]
Prelude> case z of (_:_) -> "matched"
"matched"
it :: String
Prelude> z
[*** Exception: Prelude.undefined
The undefined bomb only goes off when I start to force the elements of z; prior to that no strictness has been gained, and the list contains a thunk as normal. In particular, this version of <$!> wouldn't help with the lazy IO problem described in that stackoverflow question Christopher linked earlier.