tl;dr there are no real equivalents, but switch is most easily translated with case, and if is most easily translated with guards.
Most often, switching is done without any dedicated construct at all, but simply with multiple function clauses.
f :: Char -> String
...
f 'k' = "kay"
f 'l' = "el"
f 'm' = "em"
...
Which is in fact translated to a case expression by GHC internally,
f c = case c of
...
'k' -> "kay"
'l' -> "el"
'm' -> "em"
...
Of course, all of this, like all of Haskell, is purely functional. It doesn't work like switch in C++, which is all about the side-effects.
...But Haskell can do side-effects too, only, they're not statements but expressions of a a suitable monadic type. case can thus be used even for imperative switching.
main :: IO ()
main = do
putStrLn "Hi, what's your name?"
userName <- getLine
case words useName of
[singleName] -> do
putStrLn "Select if this is your first (F) or last (L) name."
nameKind <- getLine
...
[firstName, lastName] -> do
putStrLn "You entered you full name, thanks."
Haskell's if most directly corresponds to C++' ?: ternary operator, rather than its if construct. But again, this can be used for expressions as well as imperative flow, because in Haskell everything is an expression.
main = do
putStrLn "Hi, what's your name?"
userName <- getLine
if length (words useName) == 2
then putStrLn "You entered you full name, thanks."
else error "Please enter both first and last name."
Note that the else is obligatory.
if is actually not used very often in Haskell; guards are more elegant when there are multiple different conditions.
The closest analogue to a C++ if without else (“if cond then do this stuff, else just continue”) is when, which is not a keyword but just a combinator defined in a library.