我在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的列表(我将其用作调试器)).有谁知道如何解决这个问题?
您可以使用标准lists:filter/2
函数或列表推导,以及使用lists:member/2
函数来确定字符是否是元音:
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"]