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