我在Erlang中遇到一个小问题.我想返回一个字符串的所有元音的列表.例如:
vowels:conditional("AGGEHA").
["A","E","A"]
Run Code Online (Sandbox Code Playgroud)
这是建议的代码:
-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.
Run Code Online (Sandbox Code Playgroud)
问题是当我使用该conditional函数时,它总是返回false(或者在这种情况下,根据字符串的长度返回1的列表(我将其用作调试器)).有谁知道如何解决这个问题?
您可以使用标准lists:filter/2函数或列表推导,以及使用lists:member/2函数来确定字符是否是元音:
conditional(String) ->
lists:filter(fun(C) -> lists:member(C, [$A,$E,$I,$O,$U]) end, String).
Run Code Online (Sandbox Code Playgroud)
要么
conditional(String) ->
[C || C <- String, lists:member(C, [$A,$E,$I,$O,$U])].
Run Code Online (Sandbox Code Playgroud)
给出你的示例输入,"AGGEHA"这两个都返回字符列表"AEA",但如果你真的希望它们将每个元音作为一个字符串返回,["A","E","A"]就像你已经显示的那样,只需将返回的字符放在一个列表中,最简单的方法是使用列表解析:
conditional(String) ->
[[C] || C <- String, lists:member(C, [$A,$E,$I,$O,$U])].
Run Code Online (Sandbox Code Playgroud)
通过该更改,您将获得所请求的原始结果:
1> vowels:conditional("AGGEHA").
["A","E","A"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |