了解Erlang列表解析生成器

jq6vz3qz  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(146)

给定此函数:

pretty_print(Folders, Depth) ->
    
        {CurrrentFolder, ListSubfolders} = Folders,
        SignTemp = lists:duplicate(Depth, "-"),
        case Depth of
            0 -> Sign = SignTemp;
            _ -> Sign = "|" ++ SignTemp
        end,
    
        io:format("~s~s~n", [Sign, CurrrentFolder]),
        
        [pretty_print(Subfolder, Depth+1)|| Subfolder <- ListSubfolders].

当在列表解析中生成器为null或空时,Erlang中的递归函数会发生什么?
所以当变量为空时,函数不会调用自身?
那行不会出错吗?没有什么可以控制的,这行不会出错吗?

{CurrrentFolder, ListSubfolders} = Folders,

例如,在这段代码中,通过Depth控制另一个变量的行为:

case Depth of
    0 -> Sign = SignTemp;
    _ -> Sign = "|" ++ SignTemp
end,

有件事我不太明白。
当函数到达目录的最后一个文件夹时会发生什么情况?

ni65a41a

ni65a41a1#

当Elrang中的递归函数在列表解析中生成器为null或空时会发生什么?
当列表解析中的生成器为空时,则该解析也为空。不管它是否递归。
所以当变量为空时,函数不会调用自身?
是的,我知道
没有什么可以控制的,这一行不发生错误?
不,它只是假设调用者将给出一个与之匹配的参数(并且ListSubfolders是一个列表,其中的每个元素也与之匹配)。

pretty_print({CurrrentFolder, ListSubfolders}, Depth) ->    
    SignTemp = lists:duplicate(Depth, "-"),
    ... %% the rest is the same
fjnneemd

fjnneemd2#

What happens to a recursive function in Elrang when in a list comprehesion the generator is null or empty?
Easy to test:

-module(a).
-compile(export_all).

go(N) ->
    [go(X) || X <- [] ].

In the shell:

3> a:go(0).
[]

What would you expect the return value of the following to be:

[ X+1 || X <- [] ]

No different than if you defined:

f(X) -> X+1.

then executed:

[f(X) || X <- [] ]

The function doesn't get called if there is no argument to call the function with.

6bc51xsx

6bc51xsx3#

只是为了更清楚地说明。下面的代码不是用于控制的目的-它们是**'只是'**因为对于根文件夹输入,我们不希望将'|'字符(装饰性的东西)。所以即使您将它变更为Sign = SignTempSign = "|" ++ SignTemp,它不会更改逻辑。

case Depth of
    0 -> Sign = SignTemp;
    _ -> Sign = "|" ++ SignTemp
end,

在前面的代码中,Folders永远不会是[],它至少会有{CurrentFolder, []}的值(可能是空列表的是ListSubfolders)。由于下面的列表解析应用于ListSubfolders,所以它是安全的,因为如果ListSubfolders[]pretty_print将不会被调用。

[pretty_print(Subfolder, Depth+1)|| Subfolder <- ListSubfolders].
bzzcjhmw

bzzcjhmw4#

我画这个图是为了说明列表解析是如何工作的,它包含了对函数pretty_print.

的所有递归调用

相关问题