Обнаружение свиньи-латыни в Haskell - PullRequest
1 голос
/ 02 марта 2012

Я пытался написать функцию для этого, но не могу заставить GHCI понять мой код.Я пришел из ООП, поэтому функциональное программирование для меня - совершенно новая территория.

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 ]

5 голосов
/ 03 марта 2012

Несколько вопросов здесь:

  1. Тип вашей функции String -> String, поэтому она должна иметь только один аргумент, в то время как ваше определение имеет два аргумента, sentence и (x:xs).
  2. Не используйте строки типа "true" и "false".Используйте логические значения.Вот для чего они.
  3. Условие if должно быть логическим.Если вы хотите выполнить несколько условий, используйте (&&) или and, чтобы объединить их.
  4. Выражение if должно иметь как then, так и else.Вы можете думать о if x then y else z как троичный оператор x ? y : z в некоторых других языках.
  5. 'a' и 'y' имеют тип Char, поэтому вы не можете сравнить их со строками с ==.Сравните с "a" и "y".

Однако, нет смысла писать 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 голос
/ 03 марта 2012

Есть несколько вещей не так с вашим кодом, но все они незначительны.

  • Когда вы говорите checkPigLatin sentence (x:xs), вы говорите, что ваша функция принимает два аргумента: sentence и (x:xs). То, что вы хотите сказать, это просто (x:xs).

  • Нет необходимости возвращать "true", то есть String, когда вы можете вернуть True :: Bool. Bool уже является типом, который возвращает выражение внутри if. Это означает, что вам вообще не нужен оператор if.

  • В предикате в скобках вы используете , в качестве логического И, но в Haskell это &&

  • Результатом break является строка, поэтому для ее второго аргумента напишите "a", а не 'a'

  • И, наконец, - и речь идет о свином латинском, а не о Haskell - я не уверен, что сбой (snd(break('a'==) xs) == "a") будет гарантировать, что что-то не свиное латинский

Надеюсь, это поможет, и добро пожаловать!

Edit:
Вот обновленный код, если вам это нравится:

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")
0 голосов
/ 03 марта 2012

Не совсем уверен, что происходит в этой проверке строк, но, возможно, это то, что вам нужно.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...