2015-08-29 73 views
0

我可以刪除元音沒有像這樣的遞歸函數:刪除與遞歸函數的字符串的所有元音

NoVowels:: String -> String 
NoVowels xs = filter f xs where f x = not (x == ’a’ || x == ’e’ || x == ’i’ || x == ’o’ || x == ’u’) 

但我可以怎麼做一個遞歸函數?

我想是這樣的,但當然沒有工作(解析錯誤):

NoVowels :: String -> String 
NoVowels "" = error "Empty String!!" 
NoVowels (x:xs) 
    | x in (x == 'a'|| x == 'e' || x == 'i' || x == 'o' || x == 'u') = NoVowels (tail x) 

如果head是元音然後我把它剪從字符串,如果通過遞歸tail,它不是一個元音如何驗證另一個字符串而不刪除它。

更新obs:我想返回沒有元音的功能。

+1

'x'是列表的頭部。您無法找到列表尾部的頭部。您將使用'xs'而不是'tail x' – PyRulez

+2

沒有理由爲空字符串創建錯誤。事實上,它會打破你的遞歸。 – PyRulez

+2

你不應該在guard語法中使用'in'。 – PyRulez

回答

2

我變薄是有意義的定義函數isVowel :: Char->Bool,之後寫的東西是這樣的:

noVowels :: String -> String 
noVowels [] = [] 
noVowels (x:xs) 
    |isVowel x = noVowels xs 
    |otherwise = x : noVowels xs 

如果你不希望定義一個更加功能,您可以試試下面的代碼:

noVowels :: String ->String 
noVowels [] = [] 
noVowels (x:xs) 
    |not(x `elem` "aeiou") = x: noVowels xs 
    |otherwise = noVowels xs 
+0

我需要返回字符串沒有元音。對不起,我必須提到這一點。 – PlayHardGoPro

+0

@PlayHardGoPro然後定義函數isNotVowel。代碼將保持不變 –

+0

此代碼不起作用。您正在爲您的基本情況返回一個錯誤。 – PyRulez