问题:翻译成“猪拉丁语”的简单规则是采用以元音开头并添加“yay”的单词,同时接受任何与一个或多个辅音开始的单词并将其转移到后面在附加“ay”之前。例如,“able”变为“ableyay”,“stripe”变为“ipestray”。编写一个函数,将一串字母转换为Pig-Latin翻译。
实现:
-- define function to detect vowel
isVowel :: Char -> Bool
isVowel c = elem c ['u','e','o','a','i']
-- define function Latin Pig
lp ::String -> String
lp str = if (isVowel (head str)) then do {str ++ "yay"}
else
do {
str ++ (head str)
tail str
lp str
}
问题:到目前为止,我没有看到我的代码(逻辑)有任何问题。老实说,这是我为Haskell课程介绍的作业。但是编译器给了我错误:
**Couldn't match expected type `t0 -> t1 -> t2 -> t3 -> [Char]'
with actual type `Char'
Expected type: [t0 -> t1 -> t2 -> t3 -> [Char]]
Actual type: String
In the first argument of `head', namely `str'
In the second argument of `(++)', namely
`(head str) tail str lp str'
Failed, modules loaded: none.**
我的代码有什么问题?!
答案 0 :(得分:6)
首先,考虑一下模式匹配
任何非空列表都可以定义为 x:xs ,with,
x 作为头像列表
xs 作为尾部列表
然后你的代码成了,
-- define function Latin Pig
lp :: String -> String
lp [] = ""
lp (x:xs) = if (isVowel x) then str ++ "yay"
else ..... -- fill here
where str = (x:xs)
不要忘记运算符:是列表的构造函数,例如,
'a':“bab”=> “ABAB”
请记住,字符串是char的列表 此外,您可以跳过上一个示例中的where子句,如下所示,
-- define function Latin Pig
lp :: String -> String
lp [] = ""
lp str@(x:xs) = if (isVowel x) then str ++ "yay"
else ..... -- fill here
应该足以帮助你。
祝你好运
答案 1 :(得分:1)
我不确定使用递归是否符合您的要求,但这是我对您的任务的看法。您不需要使用do
monad来实现您想要的(除非这是作业的目标?)。
您可能需要考虑使用模式匹配和保护而不是if else块。
此外,就像zurgl所说的那样,你可以利用这样的字符串匹配:string@(x:xs)
这将允许你对整个字符串进行工作,同时还使用头部x
和tail {{ 1}}。
注意:所有字符串都是列表。
以下是我建议的一个简单示例。
xs
玩得开心学习哈克尔!
学习haskell的一些不错的资源:
答案 2 :(得分:1)
这是放入猪拉丁规则的另一种方式:
这更容易转换为Haskell。
(实际的Haskell代码省略了,因为这是作业。)
您会发现将isVowel
函数与Data.List中的break
函数结合起来很有帮助。
答案 3 :(得分:0)
请参考以下代码。
stopPropagation
希望此解决方案可帮助您了解有关猪拉丁的更多详细信息。