haskell始めてみたけどやっぱモナド辛いわ

test = do w <- [1..(10)]
      v <- (\x -> [x,x^2]) w
      guard $ (\x -> x `mod` 2 /= 0) v
      return v

これをdo構文を使わずに書くことは出来るのでしょうか。
そもそも3行目の有無でtestの値が変わる仕組みがよく分かりません。
return v の代わりに return w とした結果もどうしてこうなるのか?という感じで…