Erlang列表:筛选器返回“\n\f”

dbf7pr2w  于 2023-01-28  发布在  Erlang
关注(0)|答案(2)|浏览(155)

我正在函数式编程课上做一个学校项目。这个项目是关于确定一组多米诺骨牌(表示为1 - 6中两个数字的元组列表)是否可以端到端放置。我对这个问题没问题,但我遇到了一个问题,lists:filter返回的是字符串"\n\f",而不是文档中所说的列表。
我在网上找不到任何东西,想知道你们中是否有人有什么想法。
谢谢!
这是我的代码,问题出在check_dominos()函数中。

-module(challenge).
-export([test/0, check_dominos/1]).

% If there is an even number of each number, true
% else, false

extract_numbers([]) -> [];
extract_numbers([{First, Second} | T]) -> [First] ++ [Second] ++ extract_numbers(T). 

add_matching_numbers(_Previous, []) -> [];
add_matching_numbers(Previous, [First | T]) when Previous =:= First-> [Previous + First | add_matching_numbers(First, T)];
add_matching_numbers(_Previous, [First | T]) -> add_matching_numbers(First, T).

check_dominos(Dominos) -> 
    All_Numbers = extract_numbers(Dominos),
    Sorted_Numbers = lists:sort(All_Numbers),
    Accumulated_Numbers = add_matching_numbers(0, Sorted_Numbers) ,

    Filter_Lambda = fun(Num) -> Num rem 2 == 0 end,
    Result = lists:filter(Filter_Lambda, Accumulated_Numbers),

    Result.

    % Still working on the logic of this part
    %case length(Accumulated_Numbers) =:= length(Result) of 
    %    true -> true;
    %    _ -> false
    %end.

test() ->
    Test_1 = [{1, 3}, {3, 2}, {2, 1}], % Already in order
    Test_2 = [{5, 2}, {5, 6}, {6, 3}, {1, 4}], % Shouldn't work
    Test_3 = [{2, 6}, {3, 5}, {1, 4}, {3, 4}, {6, 1}, {2, 5}], % Should work

    true = check_dominos(Test_1),
    false = check_dominos(Test_2),
    true = check_dominos(Test_3).
yvt65v4c

yvt65v4c1#

Erlang字符串是字符代码的列表,默认情况下,Erlangshell试图将整数列表显示为字符串。要更改此行为,请在运行程序之前调用shell:strings(false).

9avjhtql

9avjhtql2#

上一个答案是正确的。任何只包含与可打印字符相对应的数字的列表都将显示为字符串。

Accumulated_Numbers = add_matching_numbers(0, Sorted_Numbers)

Test_2上显示为"\n\f",但显示为列表时显示为[10, 12]。请尝试在交互式erlang shell中键入[10, 12].,您确实会看到它显示"\n\f"。请尝试:

[7].

在一个交互式Erlangshell中。对我来说它显示:

[7]

试试看:

[8].

显示:

"\t"

注意:数字8到13是可打印字符,数字32到255(其中一些?)也是。其中可能有一些空白。如果您想查看可打印字符的数值,请使用美元符号,例如$\n.打印10
也就是说,按照目前的处理方式,add_matching_numbers无法得到正确的结果,只要与排序列表中的下一项不匹配,它就会丢弃一个值,这不会告诉您是否有不匹配的项,[10,12]List_2的结果告诉您:与其它结果一样,它是偶数的列表。
祝你好运找到你的解决方案。

相关问题