我已经尝试编写一个函数来执行此操作,但无法让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"
答案 0 :(得分:5)
这里有几个问题:
String -> String
,因此它应该只有一个参数,而您的定义有两个参数sentence
和(x:xs)
。"true"
和"false"
等字符串。使用布尔值。这就是他们的目的。if
的条件必须是布尔值。如果您想要保留多个条件,请使用(&&)
或and
进行组合。if
- 表达式必须同时包含then
和else
。您可以将if x then y else z
视为其他语言中的三元x ? y : z
运算符。'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 :(得分:1)
您的代码存在一些问题,但它们都很小。
当您说checkPigLatin sentence (x:xs)
时,您说您的函数有两个参数:sentence
和(x:xs)
。你的意思是(x:xs)
。
当您可以返回"true"
时,无需返回String
,即True :: Bool
。 Bool
已经是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