Haskell 带有elem的if语句导致错误输出

Haskell 带有elem的if语句导致错误输出,haskell,Haskell,我已经写了一个程序,其目的是替换/扩展一个给定单词中的每个辅音字符,使之成为常量本身、一个“o”和后面的常量。如果角色是人声角色,程序应该忽略它并继续 例如,字符串“progp”的结果应该是“poprorooggpop”。字符串“progp”中唯一的人声是“o”,因此不应重复。 这基本上意味着我想构造一个用字符串替换字符的程序 这就是我到目前为止所做的: rovarsprak :: String -> String --Definition of our function which

我已经写了一个程序,其目的是替换/扩展一个给定单词中的每个辅音字符,使之成为常量本身、一个“o”和后面的常量。如果角色是人声角色,程序应该忽略它并继续

例如,字符串“progp”的结果应该是“poprorooggpop”。字符串“progp”中唯一的人声是“o”,因此不应重复。 这基本上意味着我想构造一个用字符串替换字符的程序

这就是我到目前为止所做的:

rovarsprak :: String -> String    --Definition of our function which recieves an String as input and returns a String--
isVocal :: Char -> String       --Function which determines if a letter is a vocal or not--

vocals = ["aeiouy"]; --List with relevant vocals--

rovarsprak [] = [];  --Case for empty input--
rovarsprak (x:xs) = isVocal(x) ++ rovarsprak(xs)

isVocal x = if elem [x] vocals
  then [x]
  else [x] ++ "o" ++ [x]
如果我使用输入参数“progp”编译并运行它,我会收到:

“poprorooogogpop”

输出中的每一个都是正确的直到“PRO”中的句子中的“O”字符,因为声音“o”不应该以这种方式重复。 我怀疑错误存在于if语句的elem部分,或者它可能与递归有关


值得注意的是,我对haskell编程非常陌生,已经搜索了与elem语句相关的问题,但没有成功

代码中有两个错误。首先,字符串已经是字符列表,所以
vocals=“aeiouy”
就足够了

然后您可以测试
elem x人声

此外,您的循环函数
rovarsprak
不是尾部递归函数
foldl
将通过处理签名中的累加器来实现这一点(更清楚的是,它是一个循环):


您的代码中有2个错误。首先,字符串已经是字符列表,所以
vocals=“aeiouy”
就足够了

然后您可以测试
elem x人声

此外,您的循环函数
rovarsprak
不是尾部递归函数
foldl
将通过处理签名中的累加器来实现这一点(更清楚的是,它是一个循环):


人声
旨在成为
字符串
,而不是
[String]

vocals = "aeiouy" --List ['a','e','i','o','u','y'] with relevant vocals--
isVocal
如果返回一个
Bool
,将是一个好名字;实际上,您返回的字符串可能不同,因此类似于
辅音音节表
的内容会更好

请注意,只返回正确的字母列表比构建一组短列表并将它们连接起来更简单

consonantToSyllable x = if elem x vocals then [x] else [x,'o',x]

上面的递归是由
concatMap
捕获的模式:将函数映射到列表上,然后将结果列表连接到一个列表中

rovarsprak word = concatMap consonantToSyllable word
或者只是

rovarsprak = concatMap consonantToSyllable

人声
旨在成为
字符串
,而不是
[String]

vocals = "aeiouy" --List ['a','e','i','o','u','y'] with relevant vocals--
isVocal
如果返回一个
Bool
,将是一个好名字;实际上,您返回的字符串可能不同,因此类似于
辅音音节表
的内容会更好

请注意,只返回正确的字母列表比构建一组短列表并将它们连接起来更简单

consonantToSyllable x = if elem x vocals then [x] else [x,'o',x]

上面的递归是由
concatMap
捕获的模式:将函数映射到列表上,然后将结果列表连接到一个列表中

rovarsprak word = concatMap consonantToSyllable word
或者只是

rovarsprak = concatMap consonantToSyllable

我可以问你从哪本书学习吗?我可以问你从哪本书学习吗?
isVocal
的定义也需要更新以返回字符串而不是字符串列表。
isVocal
的定义也需要更新以返回字符串而不是字符串列表。