2014-05-12 26 views
1

我正在嘗試編寫一個haskell程序,它接受一個字符串並返回一個只包含元音的新字符串,但是出現此錯誤。`Char'被應用於太多的類型參數

`Char' is applied to too many type arguments 
In the type signature for `vowels': vowels :: Char a => a -> a 

這裏是我的代碼:

vowels :: (Char a) => a -> a 
vowels str = [ x | x <- str, x `elem` ['A','E','I','U','Y','O']] 
+0

你能告訴你的函數應該是什麼類型嗎? – duplode

+0

字符列表:/因此,我以前試過使用 元音::(Char [a])=> [a] - > [a] 但我得到相同的錯誤:/ – user3334838

+1

所以你有一個*需要的函數* Char的列表和*返回* Char的列表。你把它寫成'[Char] - > [Char]'(即你用'Char'替換通用'a')。 '(char a)=> ...'會說'a'是'Char'類的實例(如果存在的話),這是一個非常不同的事情。 – duplode

回答

5

你的類型的簽名應該是

vowels :: [Char] -> [Char] 
vowels str = [ x | x <- str, x `elem` ['A','E','I','U','Y','O']] 

vowels :: String -> String 

在你的代碼,(Char a) => ...表示該類型a應該是類型類別Char的一個實例。但是,Char是一種數據類型,而不是類型類,這就是爲什麼你會得到錯誤。既然你不需要任何類來實現這個功能,你可以刪除這個約束。

+0

工作表示感謝。我試着改變我的類型簽名到 'vowels ::(Char [a]) - > [a] - > [a]'只是出於好奇才遵循上面的例子,但是它拋出了相同的錯誤..是否有特定的之所以這是錯誤的原因? – user3334838

+1

@ user3334838您似乎將類型與類型類混淆。當你看到像'Eq a => a - > a - > Bool',這與* Eq - > Eq - > Bool'不是同一事物 - 後者是一個錯誤,並且不是有效的Haskell代碼。當你看到'Eq a'時,你應該閱讀「任何類型'a',它是'Eq'類型的成員。」 'char'不是*類型類型,所以它不能有成員! – kqr

0

這是你想要實現的嗎?

vowels :: String -> [Char] 
vowels = let 
      y = ['A','a','E','e','I','i','U','u','Y','y','O',o'] 
     in filter.(\x -> elem x y) 
+0

是的,但我正試圖使用​​一個更簡單的版本,因爲我剛開始學習Haskell,我不是真的習慣於使用「lambda」符號等 – user3334838

相關問題