在Haskell中检测Pig-Latin

时间:2012-03-02 19:57:15

标签: haskell functional-programming

我已经尝试编写一个函数来执行此操作,但无法让GHCI理解我的代码。我来自OOP背景,所以函数式编程对我来说是一个全新的领域。

checkPigLatin :: String -> String
checkPigLatin sentence (x:xs)
    | check == "true" = "This is Pig Latin"
    | otherwise = "Not Pig Latin"
    where check = if (x `elem` "aeiouAEIOU", '-' `elem` xs, snd(break('a'==) xs) == 'a', snd(break('a'==) xs) == 'y') then "true"

3 个答案:

答案 0 :(得分:5)

这里有几个问题:

  1. 您的函数类型为String -> String,因此它应该只有一个参数,而您的定义有两个参数sentence(x:xs)
  2. 请勿使用"true""false"等字符串。使用布尔值。这就是他们的目的。
  3. if的条件必须是布尔值。如果您想要保留多个条件,请使用(&&)and进行组合。
  4. if - 表达式必须同时包含thenelse。您可以将if x then y else z视为其他语言中的三元x ? y : z运算符。
  5. 'a''y'的类型为Char,因此您无法将其与==的字符串进行比较。与"a""y"进行比较。
  6. 但是,写if something then True else False没有意义。相反,只需直接使用布尔表达式。

    checkPigLatin :: String -> String
    checkPigLatin (x:xs)
        | check     = "This is Pig Latin"
        | otherwise = "Not Pig Latin"
        where check = and [ x `elem` "aeiouAEIOU"
                          , '-' `elem` xs
                          , snd (break ('a'==) xs) == "a"
                          , snd (break ('a'==) xs) == "y"
                          ]
    

答案 1 :(得分:1)

您的代码存在一些问题,但它们都很小。

  • 当您说checkPigLatin sentence (x:xs)时,您说您的函数有两个参数:sentence(x:xs)。你的意思是(x:xs)

  • 当您可以返回"true"时,无需返回String,即True :: BoolBool已经是if内的表达式返回的类型。这意味着您根本不需要if语句。

  • 在括号中的谓词中,您使用,作为逻辑AND,但在Haskell中它是&&

  • break的结果是一个字符串,因此请为其第二个参数写"a",而不是'a'

  • 最后 - 这是关于猪拉丁语,而不是Haskell - 我不确定失败的(snd(break('a'==) xs) == "a")是否会保证某些东西不是拉丁语

希望这有帮助,欢迎!

编辑:
如果您愿意,可以使用以下代码:

checkPigLatin :: String -> String
checkPigLatin (x:xs)
    | check = "This is Pig Latin"
    | otherwise = "Not Pig Latin"
    where check = (x `elem` "aeiouAEIOU") &&
                  ('-' `elem` xs) && 
                  (snd(break('a'==) xs) == "a") && 
                  (snd(break('a'==) xs) == "y")

答案 2 :(得分:0)

不太确定字符串检查中发生了什么,但也许这就是你需要的。

checkPigLatin :: String -> String
checkPigLatin [] = "Empty string"
checkPigLatin (x:xs)
    | check = "This is Pig Latin"
    | otherwise = "Not Pig Latin"
    where check = and [ x `elem` "aeiouAEIOU"
                      , '-' `elem` xs
                      , snd ( break ('a' == ) xs ) == "a"
                      , snd (break ('a' == ) xs) == "y"
                      ]

pisya> checkPigLatin "checkPigLatin"
"Not Pig Latin"
it :: String