Problem 0
You've defined n = 0. I suspect you meant to use that as a kind of running variable that's increased in every recursion step. That's not possible in Haskell – if you define n = 0 at the top-level, then n will always be 0.
To have such a “running variable”, you need to make it the argument of a recursive-loop function. You seem to have attempted something like that with check and its n argument (this is then a completely different variable, which shadows the global n – shadowing can easily lead to confusion, avoid it). The standard name for such a local function is go, and it would be used like
vowel :: String -> Bool
vowel a = go 0
where go n = case a !! n of
... -> False
... -> True
... -> ... go (n+1) ...
Problem 1
You use list-indexing to loop over all the elements of a list. That's clumsy and unsafe (giving an obscure error when you index outside the list)†; the preferred way to do something like this is either to use the standard folding operations (see below), or to write your recursion on the list directly via pattern-matching, rather than an integer indexing variable. So we can trash that n argument again and recurse on the list instead:
vowel :: String -> Bool
vowel a = go a
where go (x:xs) = case x of
... -> False
... -> True
... -> ... go xs ...
Note that this will automatically fail at the end of the list, because then the pattern x:xs can't be matched anymore. Easy and clear, just add a special clause:
where go (x:xs) = case x of
... -> False
... -> True
... -> ... go xs ...
go [] = ...
Actually, at this point, go is just a local pre-definition of vocal, so you might as well pull the recursion to the top-level:
vowel :: String -> Bool
vowel [] = ...
vowel (x:xs) = ... vowel xs ...
Problem 2
You've tried to declare check in a guard-list. That's not supported – see above, where should be used for local definitions, alternatively let‡.
Problem 3
You've tried to write multiple equality-options in a single chain of ||. This isn't possible because each comparison takes a (in this case) number and gives a Bool result, so you can't just chain them. What you can do is write out x == 'a' || x == 'e' || ..., but that's obviously awkward. A much neater option, as suggested by Willem, is to write x `elem` "aeiouy" instead: that will just the right thing.
If you haven't come across those backticks `` yet: they take a two-argument function like elem and put it into infix mode. This is similar to the infix + in n + 1.
The nice thing about infixes is that you can make a section of them: to define the function that takes a character and compares it with every vowel, you could write
isVowel c = elem c "aeiouy"
but you could also just write
isVowel = (`elem` "aeiouy")
Note that I've completely eliminated the variable, through eta reduction. This is called point-free style.
Where this comes in handy: it's not really necessary to define isVowel as a named function for your application – you only use it for one purpose anyway, namely compare against all chars in the string. The most common way to apply an operation to all elements of a container and combine the results¶ is foldr. You can use it like
vowel = foldr ((||) . (`elem` "aeiouy")) False
That's a bit cryptic; fortunately this combination of logical-or and fold has a standard name: any. With it, you can everything as concise as
vowel = any (`elem` "aeiouy")
†Indexing into a list is also very inefficient: !! needs to traverse all the elements up to the requested one. This gives your attempt a complexity of O (n2), when O (n) would be completely sufficient.
‡Incidentally, it is possible to define something in a single guard, but only by abusing the pattern guard feature.
¶To just gather the results again in a container, you can use the simpler fmap instead.