问题:翻译成“拉丁猪”的简单规则是,以一个以元音开头的单词加上“ 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.**
我的代码怎么了?!
首先,请考虑模式匹配。可以将任何非空列表定义为x:xs,其中,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)
不要忘记,运算符:是list的构造函数,例如,'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
应该足以帮助您。祝你好运
请参考以下代码。
这是猪拉丁规则的另一种方式:
我不确定使用递归是否属于您的要求,但这是我的任务。您不需要使用break
monad即可实现所需的功能(除非这是分配的目标?)。
[您可能要考虑使用模式匹配和保护而不是if else块。