在Erlang中返回元音列表

时间:2015-12-26 17:59:04

标签: erlang

我在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,具体取决于字符串的长度(我将其用作调试器) )。有谁知道如何解决这个问题?

2 个答案:

答案 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)].