我在Erlang中遇到一个小问题。我想返回一个字符串的所有元音的列表。例如:
vowels:conditional("AGGEHA").
["A","E","A"]
以下是建议的代码:
-module(vowels).
-compile([export_all]).
isvowel('') -> false;
isvowel(C) -> if
C =:= "A" -> true;
C =:= "E" -> true;
C =:= "I" -> true;
C =:= "O" -> true;
C =:= "U" -> true;
true -> false
end.
conditional([]) -> [];
conditional([A|T]) -> case isvowel(A) of
true -> [A] ++ conditional(T);
false -> [1] ++ conditional(T)
end.
问题是当我使用conditional
函数时,它总是返回false
(或者在这种情况下,一个列表为1,具体取决于字符串的长度(我将其用作调试器) )。有谁知道如何解决这个问题?
答案 0 :(得分:8)
您可以使用标准lists:filter/2
function或列表推导,同时使用lists:member/2
function确定字符是否为元音:
conditional(String) ->
lists:filter(fun(C) -> lists:member(C, [$A,$E,$I,$O,$U]) end, String).
或
conditional(String) ->
[C || C <- String, lists:member(C, [$A,$E,$I,$O,$U])].
鉴于您的示例输入"AGGEHA"
,这两个字符都会返回"AEA"
字符列表,但如果您真的希望它们将每个元音作为字符串["A","E","A"]
返回给您,就像您一样如图所示,通过将返回的字符放在列表中,最简单的方法是使用列表解析:
conditional(String) ->
[[C] || C <- String, lists:member(C, [$A,$E,$I,$O,$U])].
通过此更改,您将获得所请求的原始结果:
1> vowels:conditional("AGGEHA").
["A","E","A"]
答案 1 :(得分:4)
您正在混合使用''
,""
和$
语法。最小的修复是:
is_vowel(C) ->
if C =:= $A -> true;
...
true -> false
end.
更好的解决方案是直接模式匹配和带过滤器的列表理解:
is_vowel($A) -> true;
...
is_vowel(_) -> false.
conditional(String) -> [C || C <- String, is_vowel(C)].