我刚刚开始学习Haskell而且我有点卡住了。
https://gyazo.com/b70aee3b5a031a6d65ea2fe993ea0824
我已经尝试过了,我真的不知道该如何绕过我出错的地方。
vowels :: String -> String
vowels [] = []
vowels xs = [] == [ x | x <- vowels , x == "a" || x == "e" || x == "i" || x == "o" || x == "u" ]
答案 0 :(得分:9)
你快到了
vowels xs = [ x | x <- xs , x == 'a' ||
x == 'e' ||
x == 'i' ||
x == 'o' ||
x == 'u' ]
String
litterals被"
所包围,其中Char
所有者'
和Haskell内部String
只有[Char]
所以你需要使用字符。但是haskell以简洁和富有表现力而闻名 - 列表理解是一种很好的方式,但我们能做得更好吗?
你实际上做的是实现一个filter
,所以让我们分析一下你要过滤的内容 - 元音,让我们提取那部分:
isVowel x = x == 'a' || ... || x == 'u'
这仍然不优雅,但有一个名为elem
的函数可以检查列表中是否包含某些内容。
isVowel x = x `elem` ['a','e','i','o','u']
并且知道String
= [Char]
我们可以重写它(使用所谓的反引号语法,它允许使用2个参数的函数作为中缀函数)
isVowel :: Char -> Bool
isVowel x = x `elem` "aeiou"
然后回到原来的问题,因为我们有一个函数告诉我们元音是什么......
vowel :: String -> String
vowel = filter isVowel
现在你可能会对xs
的位置感兴趣 - 好吧,因为haskell有一个很好的类型系统,它可以推导出=
符号的两边都缺少一个参数,你不是需要自己写(这种风格叫做pointfree)。