返回Erlang中的元音列表

返回Erlang中的元音列表,erlang,Erlang,我在Erlang遇到了一个小问题。我想返回字符串中所有元音的列表。例如: vowels:conditional("AGGEHA"). ["A","E","A"] 建议的守则如下: -module(vowels). -compile([export_all]). isvowel('') -> false; isvowel(C) -> if C =:= "A" -> true; C =:= "E" ->

我在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.
问题是,当我使用
条件
函数时,它总是返回
false
(或者在本例中,根据字符串的长度,返回一个1的列表(我将其用作调试器))。有人知道如何解决这个问题吗?

你混合了
'
'
$
语法。最基本的解决方案是:

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)].
元音($A)->正确吗;
...
是元音(u)->假。

条件(字符串)->[C | | C您可以使用标准或列表理解,以及使用来确定字符是否为元音:

conditional(String) ->
    lists:filter(fun(C) -> lists:member(C, [$A,$E,$I,$O,$U]) end, String).

通过该更改,您将获得您请求的原始结果:

1> vowels:conditional("AGGEHA").
["A","E","A"]

为什么不使用standart模块呢?例如:非常感谢您的帮助!我从来都不记得“”或“”语法!
conditional(String) ->
    [[C] || C <- String, lists:member(C, [$A,$E,$I,$O,$U])].
1> vowels:conditional("AGGEHA").
["A","E","A"]