Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 将字符串转换为另一种格式_Erlang - Fatal编程技术网

Erlang 将字符串转换为另一种格式

Erlang 将字符串转换为另一种格式,erlang,Erlang,我想将二进制字符串转换为以下字符串“”。 换句话说,每个字节应在一个“小于”字符和一个“大于”字符之间写入 我想这个函数是递归的?请注意,abc只是一个例子 1>列表:展平([[$]| | C[$]end,binary_to_list())。 1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]). "<a><b><c>" 或 f(C)->[$]。

我想将二进制字符串
转换为以下字符串
”。 换句话说,每个字节应在一个“小于”字符和一个“大于”字符之间写入

我想这个函数是递归的?请注意,abc只是一个例子

1>列表:展平([[$]| | C[$]end,binary_to_list())。
1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]).
"<a><b><c>"

f(C)->[$]。
列表:flatmap(有趣的f/1,二进制的列表()。

使用二进制理解:

2> [[$<, C, $>] || <<C:1/binary>> <= <<"abc">>].
[[60,<<"a">>,62],[60,<<"b">>,62],[60,<<"c">>,62]]

2>[[$]| |就效率而言,这个答案可能不是最好的(我没有将它与其他解决方案进行比较),但它确实有助于理解如何在erlang中的不同集合上发明自己的迭代器,以实现特定目标,而不是使用预定义的迭代器

  fr(<<>>, Output) -> Output;
  fr(<<"b", Rest/binary>>, Output) ->
    fr(Rest, <<Output, "b">>);
  fr(<<C:8, Rest/binary>>, Output) ->
    fr(Rest, <<Output/binary, $<, C:8, $>>>).

  f(Input) -> fr(Input, <<>>).
fr(,输出)->输出;
fr(,输出)->
fr(其余,);
fr(,输出)->
fr(其余,)。
f(输入)->fr(输入,)。

另外,看起来这个解决方案实际上是最有效的:)

如果你想要一个简单的列表,最有效的可能是:

fr(<<C,Rest/binary>>) ->
    [$<,C,$>|fr(Rest)];
fr(<<>>) -> [].
fr()->
[$| fr(剩余)];
fr()->[]。

此扩展类似于列表/二进制理解扩展到的内容。

如果您编写所需的示例输出,这将非常有用。哦!是否可以将函数添加到flatten中。例如,如果C为b,则不将<和>?好的,不将其放入列表:Flatte/1中,因为它只接受一个参数,即列表。列表:fla另一方面,tmap/2。请参见编辑。foreach(乐趣,列表)不可能吗?我不理解扁平化的概念…参考资料可以在erlang.org或上找到。学习一些基本知识可能是一本不错的读物。接受最能帮助你理解问题的帖子也总是很感激的。:)如果性能很重要,如果结果会通过套接字或文件发送,这是一个很好的解决方案为什么要构建新的单字节二进制文件| |你没有将它与其他解决方案进行比较吗?你应该这样做!我打赌你用HiPE编译的代码在当前可用的其他答案中会比任何解决方案都好。可能是,我仍然更愿意指出代码尾递归背后的思想,以及它在设计复杂高效迭代器中的用途。我可以想象在tail-call参数比许多其他解决方案快一点点。
  fr(<<>>, Output) -> Output;
  fr(<<"b", Rest/binary>>, Output) ->
    fr(Rest, <<Output, "b">>);
  fr(<<C:8, Rest/binary>>, Output) ->
    fr(Rest, <<Output/binary, $<, C:8, $>>>).

  f(Input) -> fr(Input, <<>>).
fr(<<C,Rest/binary>>) ->
    [$<,C,$>|fr(Rest)];
fr(<<>>) -> [].