有没有办法定义一个单词是否只有“a”元音?

Mar*_*ini 2 haskell function

我试图在 haskell 上创建一个函数,我知道该函数的定义如下:

justWithA : [Char] -> Bool
justWithA [] = True
justWithA (x:xs) | (x == "a") = x + justWithA xs                 
                 | else (x == "e") = False
                 | else (x == "i") = False
                 | else (x == "o") = False
                 | else (x == "u") = False
Run Code Online (Sandbox Code Playgroud)

我认为有更好的方法来定义这个函数,只是不知道正确的方法......

Wil*_*sem 5

目前的实施存在一些问题:

  • 守卫不使用else关键字;
  • x是a Char,所以你比较的是x == 'a',不是x == "a"
  • x + justWithA xs没有意义,因为x是 aChar并且不能将 aChar和加Bool在一起;和
  • 如果字符串包含辅音,你的函数将会出错,因为这些辅音没有被任何保护覆盖。

您可以使用以下方法修复该功能:

justWithA : String -> Bool
justWithA [] = True
justWithA (x:xs)
    | x == 'a' = justWithA xs
    | x == 'e' = False
    | x == 'i' = False
    | x == 'o' = False
    | x == 'u' = False
    | otherwise = justWithA xs
Run Code Online (Sandbox Code Playgroud)

我们在这里只寻找元音,如果有一个元音是e,,,或,那么我们返回。iouFalse

我们可以将其简化为:

justWithA :: String -> Bool
justWithA = all (`notElem` "eiou")
Run Code Online (Sandbox Code Playgroud)

或者如果您也想考虑大写:

justWithA :: String -> Bool
justWithA = all (`notElem` "eiouEIOU")
Run Code Online (Sandbox Code Playgroud)