我是Erlang的新手,正在测试不同的功能以掌握它们。我希望这个函数能够返回一个整数,该整数表示使用foldl函数在字符串中重复字母变量的次数,但是在决定“fun”函数时有点困难。有什么帮助吗?
我希望函数返回的示例:
`test:count("Hello this is a test", $i)`
应该返回2
test:count("Hello this is a test", $t)
应该返回3
-spec count(String, Char) -> integer() when
String::string(),
Char::char().
count(String, Char) ->
F = ???,
lists:foldl(F, 0, String).
答案 0 :(得分:1)
根据Hynek -Pichi- Vychodil的回答,你也可以写下这样的折叠:
count(String, Char) ->
F = fun(C, Count) when C=:=Char-> Count + 1;
(_, Count) -> Count
end,
lists:foldl(F, 0, String).
答案 1 :(得分:0)
F = fun(C, Acc) ->
%% Fill this in yourself ;)
end,
请记住,函数F
中返回的值是下一次迭代中累加器Acc
的值。在最后一次迭代中,累加器Acc
的当前值将由lists:foldl/3
返回。
在您的代码中,第一个迭代的Acc
值将为0
,因为您输入了lists:foldl/3
的第二个参数。你正走在正确的轨道上。
您的函数只需要比较当前字符C
是否等同于Char
。如果是,请递增Acc
并将其返回。否则,请不要递增Acc
并返回相同的变量。
希望这有帮助!
答案 2 :(得分:0)
字符串中特定字符的出现长度也是一样的。
count(String, Char) ->
Occurrences = [ X || X <- String, X == Char],
length(Occurrences).
答案 3 :(得分:0)
我根本不会使用lists:foldl/3
。
count(String, Char) ->
count(Char, String, 0).
count(_, [], Count) -> Count;
count(C, [H|T], Count) ->
count(C, T, if C =:= H -> Count+1; true -> Count end).
或更常见的是
count(_, [], Count) -> Count;
count(C, [C|T], Count) -> count(C, T, Count+1);
count(C, [_|T], Count) -> count(C, T, Count).
但如果你坚持
count(String, Char) ->
F = fun(C, Count) ->
if C =:= Char -> Count + 1;
true -> Count
end
end,
lists:foldl(F, 0, String).