从字符串中获取元音并在Haskell中打印它们

时间:2016-08-09 19:23:34

标签: haskell

我刚刚开始学习Haskell而且我有点卡住了。

https://gyazo.com/b70aee3b5a031a6d65ea2fe993ea0824

我已经尝试过了,我真的不知道该如何绕过我出错的地方。

vowels :: String -> String
vowels [] = []
vowels xs = [] ==  [ x | x <- vowels , x == "a" || x == "e" || x == "i" || x == "o" ||  x == "u" ]

1 个答案:

答案 0 :(得分:9)

首先

你快到了

vowels xs = [ x | x <- xs , x == 'a' ||
                            x == 'e' ||
                            x == 'i' ||
                            x == 'o' ||
                            x == 'u' ]

但实际错误是什么?

  1. 您使用该功能作为列表的输入
  2. String litterals被"所包围,其中Char所有者'和Haskell内部String只有[Char]所以你需要使用字符。
  3. 但是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)。